Commit Graph

173 Commits

Author SHA1 Message Date
Nubenetes Bot
b52f793ea5 ci: harden develop write-path against races & make PR Guardian advisory
Root cause of the recurring README-sync failure: 05.1 modified README.md in
earlier steps then ran `git pull`, which aborts on a dirty tree whenever a
concurrent bot commit advanced develop first. Rewrote its commit step as a
fetch → reset --hard → regenerate → commit → push retry loop (README is a pure
function of inventory, so a hard reset never loses data and eliminates the
merge-conflict / --ours/--theirs class entirely).

Also:
- 03.1/03.2/03.3: wrap the single-shot pull --rebase && push in a 5x retry loop.
- 07.1 PR Guardian: continue-on-error (advisory; keeps the comment, drops the
  blocking red  on AI false positives) + PR-scoped concurrency.
- 07.2 Markdown Linter: PR/branch-scoped concurrency with cancel-in-progress.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:06:10 +02:00
Nubenetes Bot
c70aef8b78 fix: readme-sync push loop — switch from rebase to merge-based retry
The rebase loop never attempted a push after self-healing; it looped
back to `git pull --rebase` and hit a fresh conflict every iteration
(5x), then the final bare push failed non-fast-forward.

Root cause: in a rebase `--ours` = remote side (not our bot commit),
so the README was discarded and rebuilt each round while the remote
kept advancing.

Fix:
- Pull latest *before* committing (shrinks conflict window)
- Retry loop now tries push first, then merge-pulls on rejection
- Uses `-X ours` merge (correct semantics: keep bot's README)
- Re-runs updater after each merge so metrics stay consistent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 16:02:13 +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
Nubenetes Bot
1dd0dab308 fix: 3 critical publisher/deploy safety issues
1. Skip page deletion and nav sync in --render-only mode
   The CI publisher always uses --render-only but the pruning phase was
   deleting pages not regenerated in a given pass (e.g. low-hit pages),
   breaking nav references and corrupting the MkDocs build.

2. Protect dimension pages from deletion in full mode
   Even in a full (non-render-only) run, pages defined in self.dimensions
   are never deleted. Truly orphaned pages (not in dimensions AND not
   generated) are the only ones pruned.

3. _sync_enterprise_navigation returns True/False
   Deletion is gated on nav sync success. If nav sync fails, deletion
   is skipped to prevent inconsistency (deleted files + stale nav).
   Also fixes the fragile re.sub(r'nav:.*') regex by using string
   indexing instead, preventing accidental truncation of extra_css etc.

4. Deploy workflow V2 sanity check
   If V2 build produces fewer than 50 HTML pages or no index.html,
   deploy falls back to V1-only instead of overwriting V1 with a
   broken V2 build.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 13:29:10 +02:00
Nubenetes Bot
dc4591fb3e feat: cache news_digest.json by date to avoid re-calling Gemini on re-runs
Publisher and weekly digest workflows now restore news_digest.json from
GitHub Actions cache using key news-digest-YYYY-MM-DD. If cache hits
(same-day re-run after publisher failure), the Gemini digest step is
skipped entirely — saving ~20min and Gemini API credits.

Cache is saved immediately after successful generation and expires
automatically after 7 days (GitHub Actions cache policy).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 12:14:34 +02:00
Nubenetes Bot
88f891fd4e feat: 5 improvements — geo inference, last-updated badge, search boost, RSS feed, weekly cron
1. geo_region inference: _infer_geo_from_url() infers Americas/Europe/España/Asia-Pacific
   from URL TLD (.es .de .fr .uk .jp .cn etc.) as fallback when geo_region field is empty.
   Industry digest now shows real content instead of empty categories.

2. Last-updated badge: trending section header now shows "Updated Jun 19, 2026" pill
   derived from news_digest.json mtime — gives readers confidence in freshness.

3. Search boost: tech-digest and industry-digest pages now have search.boost: 2
   frontmatter so they rank higher in MkDocs Material site search.

4. RSS feed (src/rss_generator.py): generates v2-docs/feed.xml with top-20 curated
   picks from 3-month digest. Runs after news_digest in publisher. Autodiscovery
   <link rel="alternate"> added to v2-mkdocs.yml extra_head.

5. Weekly cron (09.weekly_digest.yml): runs every Monday 06:00 UTC, generates digest
   with Gemini, renders digest pages, commits, then triggers publisher.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 11:11:02 +02:00
Nubenetes Bot
05b66d006f feat: add company/geo_region extraction to Gemini prompts, add enrichment/dedup to cron, fix nav sync for digest pages
- Update curator Gemini prompt with Phase 5: Company & Geo Classification
  to extract company name and geo_region (americas/europe/spain/asia_pacific)
  for industry digest categories
- Store company and geo_region from AI response in eval_data
- Add Intelligence Digest nav entries to _sync_enterprise_navigation so
  digest pages persist across nav rebuilds
- Add dedup scan and enrichment pipeline steps to monthly cron workflow
  (01.1.agentic_cron.yml) in addition to publish workflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 09:04:28 +02:00
Nubenetes Bot
3dc52af391 feat: add CNCF landscape integration, GitHub activity enrichment, license change detection, dedup engine, PWA support, and expanded video hub
- Add src/enrichment.py (395 lines): CNCF landscape API integration for
  project graduation status, GitHub issue/PR velocity tracking with
  community health scoring, and license change detection with history
- Add src/dedup.py (194 lines): URL normalization dedup, content-hash
  dedup, title-similarity dedup (85% threshold via SequenceMatcher),
  and resolution strategy keeping highest-quality entry
- Enable PWA/offline plugin in v2-mkdocs.yml for cached offline reading
- Expand video hub categorization with MLOps, security, IaC, GitOps,
  observability, FinOps, cloud providers, and language-specific routing
- Add dedup scan and enrichment pipeline steps to CI publish workflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 09:00:53 +02:00
Nubenetes Bot
4e87c248fd feat: implement AI-powered news digest engine, MkDocs UX overhaul, pipeline hardening, and stub page merges
- Add 26-category news digest engine (src/news_digest.py) with Gemini AI ranking
  for 3/6/12 month temporal panels across tech, cloud, and geo categories
- Add discovered_at, company, geo_region fields to inventory schema with backfill
  script populating 18K+ existing entries
- Fix critical v2-mkdocs.yml bug: plugins were nested under theme (silently disabled)
- Add MkDocs Material features: instant nav, breadcrumbs, footer, announce bar
- Add trending cards CSS grid and replace Agentic Pulse with dynamic Trending Now
- Generate tech-digest.md and industry-digest.md with tabbed 3/6/12 month views
- Merge 12 stub pages (<40 lines each) into parent categories with redirects
- Replace 50 bare except:pass patterns with contextual logging across all pipeline files
- Expand autonomous discovery from 6 to 14 GitHub search queries
- Add stale health re-check for online entries older than 30 days
- Track addition_method by source type (rss, twitter, github_trending)
- Add digest generation step to CI publish workflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 00:38:56 +02:00
Nubenetes Bot
95c7078e6a fix(ci): stage both inventory.yaml and inventory.sql in workflows to prevent unstaged rebase failures 2026-06-18 17:35:40 +02:00
Nubenetes Bot
8f31612b05 chore: unify CI/CD write concurrency to develop-git-write-lock and improve push resilience 2026-06-18 16:15:57 +02:00
Nubenetes Bot
ab72d9c411 feat: configure V2 to serve at root and V1 at /v1/ 2026-06-18 11:26:10 +02:00
Nubenetes Bot
44e607a83a feat: implement offline mock debate simulator and clickable tag filters sync 2026-06-18 03:17:22 +02:00
Nubenetes Bot
8547f8ce56 docs: add multi-agent debate explanation and mermaid diagram to README 2026-06-18 02:00:47 +02:00
Nubenetes Bot
ff9087e3a2 feat(curation): achieve 100% coverage for AI enrichment and GitHub metadata metrics without Gemini API 2026-06-18 00:49:32 +02:00
Nubenetes Bot
80097e10d2 fix(automation): harden README sync job condition to prevent evaluation errors 2026-06-14 15:54:31 +02:00
Nubenetes Bot
e23ddbbf40 feat(automation): allow manual trigger for PR Guardian with optional PR number 2026-06-14 13:57:05 +02:00
Nubenetes Bot
746966f87b fix(automation): unify README sync concurrency group to prevent race conditions 2026-06-14 13:45:18 +02:00
Nubenetes Bot
cf189f04fc fix(automation): remove branch filters from workflow_run to restore pipeline chaining 2026-06-14 10:36:48 +02:00
Nubenetes Bot
f4045dbe23 fix(automation): ensure latest develop state before PR creation 2026-06-13 20:48:54 +02:00
Nubenetes Bot
545289eb11 fix(automation): repair malformed workflow file in 03.3 2026-06-13 20:44:52 +02:00
Nubenetes Bot
9dab80ac3a feat(automation): add automated PR creation from develop to master 2026-06-13 20:37:59 +02:00
Nubenetes Bot
44af419411 feat(automation): implement automatic V2 curation pipeline chaining 2026-06-13 20:35:47 +02:00
Nubenetes Bot
68760c2148 fix: create curation-report label before creating issue 2026-06-01 23:30:36 +02:00
Nubenetes Bot
0f4898cdce feat(ci): add progressive caching for agentic curation 2026-06-01 14:49:42 +02:00
Nubenetes Bot
9bff4985e5 fix(ci): add feedparser to pip install 2026-06-01 13:12:49 +02:00
Nubenetes Bot
05c5c6efd2 fix(ci): add PYTHONPATH for sync_workflow_ui script 2026-06-01 12:22:44 +02:00
Nubenetes Bot
37a03b4f23 fix: update git add pathspec in videos workflow to stage v2-docs/videos/ directory 2026-05-28 16:01:03 +02:00
Nubenetes Bot
ed189f6426 feat: run reorganize_mosaic.py automatically in publisher workflow 2026-05-28 11:45:17 +02:00
Nubenetes Bot
1a69f53a16 docs: modularize Video Hub, fix anchors/links, and automate cron schedule [skip ci] 2026-05-27 23:26:43 +02:00
Nubenetes Bot
7487af5929 chore(workflow): fix self-referential workflow filename references 2026-05-27 23:11:32 +02:00
Nubenetes Bot
71499413d0 chore: restore and upgrade all GitHub Actions to true latest stable versions 2026-05-26 15:51:36 +02:00
Nubenetes Bot
34f72b8668 chore: update all GitHub Actions to latest stable major versions 2026-05-26 14:24:24 +02:00
Nubenetes Bot
8f3632bc37 fix: bypass failing actions/configure-pages with manual setup 2026-05-26 14:22:24 +02:00
Nubenetes Bot
02e2bef79a chore: update configure-pages to v6 for stability 2026-05-26 14:20:52 +02:00
Nubenetes Bot
39410189b7 fix: update actions/configure-pages to v5 to resolve download error 2026-05-26 14:19:12 +02:00
Nubenetes Bot
d46c0c9568 fix: downgrade invalid GitHub Action versions to stable releases 2026-05-26 14:09:08 +02:00
Nubenetes Bot
21b7679b2e chore: recreate deployment workflow with new name and group 2026-05-26 13:56:49 +02:00
Nubenetes Bot
e5a92baba8 chore: temporary remove workflow to reset triggers 2026-05-26 13:56:47 +02:00
Nubenetes Bot
7dadb962ab chore: force refresh concurrency and name for final deploy 2026-05-26 13:56:02 +02:00
Nubenetes Bot
7b254b8be8 chore: enable workflow_dispatch and fix dependency loading for deployment 2026-05-26 13:54:15 +02:00
Inaki
86c6446a4c Add deployment step to GitHub Pages workflow 2026-05-26 13:51:27 +02:00
Nubenetes Bot
bcbfcf8d84 chore: restore deployment workflow to stable trigger state 2026-05-26 13:47:36 +02:00
Nubenetes Bot
b1c86fb7a4 chore: force concurrency group refresh 2026-05-26 13:44:44 +02:00
Nubenetes Bot
fe44a24a75 chore: force workflow refresh 2026-05-26 13:43:35 +02:00
Nubenetes Bot
69b6f8dadb chore: rename deployment workflow to fix trigger issues 2026-05-26 13:36:56 +02:00
Nubenetes Bot
c9de235d90 chore: refresh deployment workflow name 2026-05-26 13:31:01 +02:00
Nubenetes Bot
9868f4ccb2 chore: enable manual deployment trigger for GitHub Pages [skip ci] 2026-05-26 13:25:11 +02:00
Nubenetes Bot
20804b469f fix: resolve recursive copy error in deployment workflow and bump to 2.3.1 2026-05-26 01:25:43 +02:00
Nubenetes Bot
515fa782cc feat: revert to Hybrid SEO-First architecture (V1 at Root, V2 at /v2/) [skip ci] 2026-05-26 01:22:34 +02:00