Reference creatortrack news hub

CreatorTrack News app (/rss) has a Google-News-style briefing. MERGED + DEPLOYED to prod 2026-07-05 (merge commit b76457c; migration 20260705T201500_news_hub_catalog.sql applied to lifeos DB, then forge_creatortrack_deploy.sh; prod :3070 healthy, /rss + /api/apps/rss no 5xx). rss_feeds now has category/catalog_id/homepage/last_fetched_at. Owner still needs to hit "Catalog" once in the live app to subscribe the 139 outlets (per-workspace, not auto-run).

  • lib/news-catalog.ts: 139 curated outlets, 11 national categories (incl. Opinion + Reads/longform) + local-austin/texas/omaha; all URLs live-validated 2026-07-05. Reuters/AP/The Athletic ride Google News site-search RSS (news.google.com/rss/search?q=site:<domain>). syncCatalog op subscribes idempotently.
  • Paywall chain (lib/news-article.ts): original -> Googlebot UA -> Wayback Machine -> archive.today mirrors (archive.ph/today/md; 404 = no snapshot, 429 = 10-min host cooldown). Full mode = archive.ph/newest/<url> link-out. archive.today 429-throttles Console's IP intermittently; UI degrades to links.
  • Read Later stays single-source via knowledge saveArticle; archive text lands via { prefetched } while note keeps the real URL.
  • Migration 20260705T201500_news_hub_catalog.sql (rss_feeds category/catalog_id/homepage/last_fetched_at) applied to dev clone only; run via forge_workspace_migrate.py at deploy.

Why: future sessions touching the News app or merging this branch need the catalog/archive design and the pending-migration gotcha. How to apply: work in ~/forge-suite-wt/feat/news-hub; full detail in [[creatortrack-dev-slot-lifecycle]] and forge handoff memory/handoffs/creatortrack-news-hub-briefing-2026-07-05.md.