Three sites in v2_optimizer where `-x.get("stars", default)` crashes
with TypeError when stars field is present but null in inventory.
Fixed with `-(x.get("stars") or default)` pattern consistently.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
item.get("resource_type", "Reference") returns None when the field
exists with a null value in the inventory. Use `or "Reference"` instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
The 5-item link list was redundant with the 6 trending cards block
that the publisher generates. Cleaner UX: hero card (amber) → trending
cards → /tech-digest/ for full 22-category view.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New hero card (amber color) between AI & MCP Agents and Agentic Video
Hub, linking to /tech-digest/ with emoji icon and subtitle
- Dynamic digest-preview block above Agentic Pulse: shows top 1 link
from 5 priority categories (Kubernetes, AI, Security, IaC, Observability)
pulled from data/news_digest.json on each optimizer run
- New CSS: hero-badge-card--amber, hero-badge-icon, digest-preview
component with category chips and hover states
- v2_optimizer now generates both the card and preview automatically
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Inventory entries can have stars=null or discovered_at=null. Replace
.get("stars", 0) with .get("stars") or 0 in all three modules so that
None values are safely coerced to 0/"" before numeric/string comparison.
Fixes TypeError crashes in:
- v2_optimizer.py:632 _calculate_tags
- dedup.py:74,108 title dedup and entry scoring
- news_digest.py:322 category pool sorting
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
detect_license_changes() iterated all repos with gh_license set, causing
hundreds/thousands of GitHub API calls. Apply the same 200-repo cap as
the activity enrichment module to keep total enrichment under ~3 min.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Consolidate 2 GitHub API calls per repo into 1: open_issues_count
already includes PRs on GitHub, second /pulls call was redundant
- Reduce MAX_REPOS_DEFAULT 500→200: sufficient for meaningful enrichment,
200 × 0.5s = ~100s vs 500 × 1.5s = ~12.5min in CI
- Reduce GITHUB_RATE_DELAY 0.75s→0.5s: still safely under 5000 req/hr
- Add 429 rate-limit backoff (5s sleep instead of crashing)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The legacy landscape.cncf.io/api/items endpoint now returns HTML (SPA)
instead of JSON. Switch to GitHub Search API querying cncf-graduated,
cncf-incubating, and cncf-sandbox topics — reliable and uses existing
GH_TOKEN auth.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Change ` ## Category` to ` **Category**` inside MkDocs Material
tabs to avoid MD023 linter errors (headings must start at col 0)
- Sanitize pipe characters in "why" text to prevent broken markdown tables
- Regenerated tech-digest.md (1328 lines, 3 tabs: 333/443/552 lines)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Variable items per period: 3 months=10, 6 months=15, 12 months=20
so each tab shows progressively more content
- Use year field as fallback in _is_within_period when discovered_at
doesn't discriminate (backfilled entries)
- Fix NoneType comparison in _fallback_items for entries with null stars
- Regenerated digest: 3m=220, 6m=330, 12m=440 items across 22 categories
- tech-digest.md now 1353 lines with differentiated tabs (339/449/559 lines)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
- 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>
- Add last_ai_eval timestamp to eval_data in both fast-track and grounded-track
evaluation paths, plus SQL schema and curator
- Entries enriched >6 months ago are automatically flagged for re-evaluation
instead of being skipped (stale content detection)
- Enhance "See Also" links with cross-dimension references based on shared
tags between pages, in addition to same-dimension related links
- Add _collect_tags_from_tree() helper for recursive tag extraction
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>