6157 Commits

Author SHA1 Message Date
Nubenetes Bot
9f70c32ff5 release: v2.9.7 — align Intelligence Digest hero card height v2.9.7 2026-06-19 15:41:49 +02:00
Inaki
7425a6a4cb Merge pull request #383 from nubenetes/fix/hero-digest-card-size
fix: align Intelligence Digest hero card height with the other 4
2026-06-19 15:41:44 +02:00
Nubenetes Bot
891f4b8dbd fix: align Intelligence Digest hero card height with the other 4
The four logo hero cards use a 100px <img>; the Intelligence Digest card
uses an emoji <div class=hero-badge-icon> that was only ~32px tall, so it
rendered shorter. Give .hero-badge-icon a 100px flex-centered box (and
matching 12px bottom margin) so all five cards are the same height.

Cache-bust bumped to ?v=2.9.7.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:41:32 +02:00
Nubenetes Bot
7c467ea752 Merge remote-tracking branch 'origin/develop' into develop 2026-06-19 15:38:53 +02:00
Nubenetes Bot
6050b39545 merge: back-merge v2.9.6 into develop 2026-06-19 15:38:51 +02:00
Nubenetes Bot
29abd31e56 release: v2.9.6 — deterministic inventory dump (last_checked INTEGER) v2.9.6 2026-06-19 15:38:46 +02:00
Nubenetes Bot
6090747083 docs: automated README metric synchronization [skip ci] 2026-06-19 13:38:44 +00:00
Inaki
fe08a271f4 Merge pull request #382 from nubenetes/fix/deterministic-dump-code
fix: deterministic inventory dump — last_checked as INTEGER
2026-06-19 15:38:19 +02:00
Nubenetes Bot
1fe0509433 fix: deterministic inventory dump — last_checked as INTEGER
last_checked stored epoch seconds as REAL; SQLite's version-specific
REAL->text float printing rewrote ~every row on dump, so a locally
regenerated inventory.sql diverged from CI's. Normalize last_checked to
int on the entry before both the SQL record and the YAML dump, and make
the column INTEGER. All readers do coarse day-level staleness checks, so
sub-second precision is unused.

Verified: load->save idempotent for inventory.sql AND inventory.yaml, and
local (SQLite 3.40.1) output byte-identical to CI-equivalent python:3.11
(SQLite 3.46.1). The deterministic data regenerates on the next pipeline
save; committing only the code avoids conflicting with pipeline data churn.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:37:51 +02:00
Inaki
d9ed471d16 Merge pull request #380 from nubenetes/develop
🚀 Release: Agentic V2 Portal Update
2026-06-19 15:32:13 +02:00
Nubenetes Bot
6bed317cdc feat: sync V2 elite curated edition and README metrics [skip ci] 2026-06-19 13:30:54 +00:00
Nubenetes Bot
a0927d47f7 Merge remote-tracking branch 'origin/develop' into develop 2026-06-19 15:24:51 +02:00
Nubenetes Bot
543e3c4d82 merge: back-merge v2.9.5 into develop 2026-06-19 15:24:49 +02:00
Nubenetes Bot
6a4a1278df docs: automated README metric synchronization [skip ci] 2026-06-19 13:24:47 +00:00
Nubenetes Bot
a6b0b19fbd release: v2.9.5 — fix runaway YouTube mosaic breaking V1/V2 index pages v2.9.5 2026-06-19 15:24:33 +02:00
Inaki
59d6234792 Merge pull request #379 from nubenetes/fix/mosaic-runaway-index
fix: stop YouTube mosaic from rendering the entire inventory (index outage)
2026-06-19 15:24:22 +02:00
Nubenetes Bot
e95cd9dc56 fix: stop YouTube mosaic from rendering the entire inventory (index outage)
load_inventory_channels() selected entries via 'youtube_mosaic' in entry
(key presence). save_inventory() always writes a youtube_mosaic column
that the SQL round-trip materializes as an empty dict {} on EVERY entry,
so the filter matched all 18,647 inventory entries and emitted ~18.6k
inline <img> links on a single line. That produced a 4MB v2-docs/index.md
(and 2.9MB docs/index.md), hanging both V1 and V2 index pages in the
browser. A prior revert masked it; the next SQL-backed sync re-broke it.

Fix: only treat an entry as a mosaic channel when youtube_mosaic is a
non-empty dict with a logo image (136 curated channels). Regenerated both
index files via reorganize_mosaic — docs/index.md is now byte-identical
to the last known-good state (52KB); v2-docs/index.md back to 41KB.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:24:00 +02:00
Nubenetes Bot
68078fa253 Merge remote-tracking branch 'origin/develop' into develop 2026-06-19 15:10:58 +02:00
Nubenetes Bot
79e0fc7f53 merge: back-merge v2.9.4 into develop 2026-06-19 15:10:56 +02:00
Nubenetes Bot
5ade4daaec docs: automated README metric synchronization [skip ci] 2026-06-19 13:10:50 +00:00
Nubenetes Bot
421765d66f release: v2.9.4 — normalize gh_pushed to None at enrichment source v2.9.4 2026-06-19 15:10:39 +02:00
Inaki
4eb8e1c21c Merge pull request #378 from nubenetes/fix/normalize-gh-pushed-source
fix: store gh_pushed as None instead of 'N/A' at enrichment source
2026-06-19 15:10:28 +02:00
Nubenetes Bot
9d13a6a21a fix: store gh_pushed as None instead of 'N/A' at enrichment source
The date field gh_pushed was written as the literal string 'N/A' when
GitHub data was unavailable (fast_enrich, gemini_utils). That non-date
string then reached datetime.fromisoformat() downstream. Now writes None
(which all readers already handle); gh_license keeps its 'N/A' string
sentinel since it is a displayed value, not a date.

Also hardens the twin fromisoformat() call in agentic_curator's MVQ
penalty check (guards N/A/None and wraps parsing) so a bad value can't
crash a curation batch.

Adds scripts/normalize_gh_pushed.py to clean the 281 existing inventory
entries (run in CI to avoid SQLite float-serialization churn — see
script docstring).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:10:06 +02:00
Nubenetes Bot
5de57738cb Merge remote-tracking branch 'origin/develop' into develop 2026-06-19 15:04:36 +02:00
Nubenetes Bot
c90d45cb4b merge: back-merge v2.9.3 into develop 2026-06-19 15:04:34 +02:00
Nubenetes Bot
325eb8a83a docs: automated README metric synchronization [skip ci] 2026-06-19 13:04:18 +00:00
Nubenetes Bot
361f34a74a release: v2.9.3 — harden Platinum audit against null/N-A inventory fields v2.9.3 2026-06-19 15:04:08 +02:00
Inaki
89016b7e64 Merge pull request #377 from nubenetes/fix/safety-audit-null-handling
fix: harden Platinum audit against null/N-A inventory fields
2026-06-19 15:03:54 +02:00
Nubenetes Bot
4212b1f5ae fix: harden Platinum audit against null/N-A inventory fields
The V2 safety audit emitted hundreds of WARN lines and then aborted
entirely with 'NoneType object has no attribute lower':

- validate_mvq_compliance: gh_pushed of 'N/A' (and historic None/empty)
  was passed to datetime.fromisoformat() -> 'Invalid isoformat string';
  and gh_stars/stars stored as null hit 'None * int'. Now skips entries
  with no usable push date and coalesces None before the star math.
- validate_linguistic_tagging: a null 'language' field caused
  None.lower(), which aborted the whole report. Now coalesces to English.
- generate_audit_report: each mandate now runs in isolation so a single
  bad entry can no longer kill the entire audit; failures are logged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:03:33 +02:00
Inaki
8cd85a35e8 Merge pull request #376 from nubenetes/develop
🚀 Release: Agentic V2 Portal Update
2026-06-19 15:02:07 +02:00
Nubenetes Bot
f85439c757 feat: sync V2 elite curated edition and README metrics [skip ci] 2026-06-19 12:59:44 +00:00
Inaki
0d10c89a0f Merge pull request #375 from nubenetes/docs/bump-claudemd-version
docs: bump CLAUDE.md current version to v2.9.2
2026-06-19 14:42:59 +02:00
Nubenetes Bot
919ecd9dfd docs: bump CLAUDE.md current version to v2.9.2
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:42:49 +02:00
Nubenetes Bot
882baa7917 Merge remote-tracking branch 'origin/develop' into develop 2026-06-19 14:41:35 +02:00
Nubenetes Bot
1def1edd28 merge: back-merge v2.9.2 into develop 2026-06-19 14:35:02 +02:00
Nubenetes Bot
4b65cbc9de release: v2.9.2 — fix dark-theme CSS content-visibility flashes v2.9.2 2026-06-19 14:33:20 +02:00
Nubenetes Bot
1fe5356c7c docs: automated README metric synchronization [skip ci] 2026-06-19 12:33:15 +00:00
Inaki
dcc01e833a Merge pull request #374 from nubenetes/fix/v2-css-content-visibility
fix: remove content-visibility from dense indexes (v2.9.2)
2026-06-19 14:32:56 +02:00
Nubenetes Bot
99c9e2f8f0 fix: remove content-visibility from dense indexes (v2.9.2)
Removed `content-visibility: auto` on broad <ul>/<ol> selectors and
.v2-tag-section. On the slate (dark) theme it produced black flashes
while scrolling and made link lists below the index mosaic appear
collapsed/broken due to intrinsic-size mismatch causing scrollbar jumps.
The tags page already uses collapsed <details> (native render skipping),
so the optimization was redundant and harmful.

Bumped CSS cache-bust to ?v=2.9.2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:32:32 +02:00
Nubenetes Bot
858f969b93 merge: back-merge v2.9.1 into develop 2026-06-19 14:10:46 +02:00
Nubenetes Bot
9c3c026f1b release: v2.9.1 — incremental Gemini digest engine v2.9.1 2026-06-19 14:10:39 +02:00
Nubenetes Bot
ce96d91c55 docs: automated README metric synchronization [skip ci] 2026-06-19 12:10:14 +00:00
Inaki
546e1df714 Merge pull request #373 from nubenetes/feat/incremental-digest-engine
feat: incremental digest engine — 0 Gemini calls when inventory unchanged
2026-06-19 14:09:55 +02:00
Nubenetes Bot
e773676a70 feat: incremental digest engine — reuse Gemini results when inventory unchanged
Each (category × period) cell in news_digest.json now carries a hash of its
entry pool (sorted URLs). Before calling Gemini, the engine checks:
  1. Hash matches stored hash (same inventory entries)
  2. Last analyzed within MAX_STALENESS_DAYS=30

Both conditions true → reuse existing ranked list, 0 Gemini API calls.
Only cells where the inventory actually changed (new/removed entries) trigger
a fresh Gemini ranking.

Expected savings: re-runs with code-only changes → 0 API calls (down from 66).
New ingestion batch → only affected categories call Gemini (5-10 of 26 typical).
Stale refresh (>30d) → full refresh at most once per month.

Also:
- Remove day-level GitHub Actions cache for digest (redundant: news_digest.json
  is committed to the repo and is the persistent store for _meta)
- Always run news_digest.py in both 04.1 and 09 workflows (it's cheap when 0
  Gemini calls are needed)
- Trending badge now reads _meta.last_updated (actual analysis date) instead of
  file mtime (which changes on every render/commit)
- Remove invalid extra_head key from v2-mkdocs.yml (left over from rollback)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 14:09:11 +02:00
Inaki
10c20f6665 Merge pull request #372 from nubenetes/develop
🚀 Release: Agentic V2 Portal Update
2026-06-19 14:07:23 +02:00
Nubenetes Bot
72bb3c5150 feat: sync V2 elite curated edition and README metrics [skip ci] 2026-06-19 11:58:46 +00:00
Nubenetes Bot
43fae0f9d0 docs: update Video Hub with high-fidelity metadata 2026-06-19 11:31:29 +00:00
Nubenetes Bot
cfe98dcada docs: automated README metric synchronization [skip ci] 2026-06-19 11:31:01 +00:00
Nubenetes Bot
6308fc66ea chore: update inventory AI analysis 2026-06-19 11:30:32 +00:00
Nubenetes Bot
1c182e500d merge: back-merge v2.9.0 into develop 2026-06-19 13:30:02 +02:00