Timeline
All 44 pull requests in date order. Generated from committed build data.
Chapter 1: Scaffolding, ingestion and clustering (Oct 7–8)
| PR | Title | Merged | Changes |
|---|
| #1 | Scaffold FastAPI app, profile config models, Docker, and CI | Oct 7, 2026 | +829 / −1 |
| #2 | Add RSS/Atom ingestion with normalized articles and deduplication | Oct 8, 2026 | +1656 / −13 |
| #3 | Phase 1 follow-ups: drop poll_interval_minutes alias, add time_field and contact-email User-Agent | Oct 8, 2026 | +132 / −18 |
| #4 | Phase 2: DB-backed profiles and keyword topics, Discover-style UI, make demo | Oct 8, 2026 | +2212 / −67 |
| #5 | Run the demo on Windows without make | Oct 8, 2026 | +218 / −7 |
| #6 | Link cards to the feed's raw permalink (Article.url); canonical_url is dedup-only | Oct 8, 2026 | +251 / −66 |
| #7 | Stories: extract article text, cluster related articles across sources, story feed and UI | Oct 8, 2026 | +3516 / −64 |
Chapter 2: Summaries, briefs, reports and the API (Oct 8–12)
| PR | Title | Merged | Changes |
|---|
| #8 | Cited story summaries via a configurable OpenAI-compatible LLM (fake LLM by default) | Oct 8, 2026 | +3107 / −66 |
| #9 | Read .env in local runs so profile ${VAR}s (LOCAL_LLM_*) resolve outside Docker | Oct 9, 2026 | +92 / −8 |
| #10 | Briefs (lead + 3 cited bullets) and detailed cited reports | Oct 9, 2026 | +2650 / −405 |
| #11 | Fix unreachable reports and report timeouts stalling briefs; shrink report input | Oct 9, 2026 | +152 / −31 |
| #12 | Publish gate: background generation, published-only pages, SSE arrivals | Oct 12, 2026 | +5534 / −948 |
| #13 | Report quality guards + metrics; /api/v1 with resumable SSE, optional auth, OpenAPI contract | Oct 12, 2026 | +4543 / −140 |
| #14 | Phase 6: story Q&A (streamed, cited answers) + attribution, publisher labels, glued-word fix | Oct 12, 2026 | +4221 / −154 |
Chapter 3: Alerts, sources and card images (Oct 12–14)
| PR | Title | Merged | Changes |
|---|
| #15 | Keyword alerts: exactly-once per story via webhook / ntfy / email, with log and UI | Oct 12, 2026 | +4812 / −147 |
| #16 | Source management, Guardian/NewsData/X adapters with budgets, Docker ops fixes | Oct 13, 2026 | +5927 / −688 |
| #17 | Card images: page images, validated + SSRF-safe WebP cache, story image selection, fallbacks, backfill | Oct 14, 2026 | +2468 / −50 |
Chapter 4: Web-search enrichment and hardening (Oct 15–17)
| PR | Title | Merged | Changes |
|---|
| #18 | Web-search enrichment: add other publishers' coverage to stories | Oct 15, 2026 | +3181 / −27 |
| #19 | Harden web-search enrichment: shared provider state, retries, per-provider queries, admission control | Oct 15, 2026 | +1565 / −144 |
| #20 | Phase 10.1: TinyFish primary enrichment provider, GDELT fallback, query hardening | Oct 15, 2026 | +1306 / −151 |
| #21 | Phase 10.2: lower enrichment thresholds, GDELT 10 s default, retry degraded passes | Oct 15, 2026 | +332 / −36 |
| #22 | Phase 10.3: enrichment recall — query continuation, rule B, link-only, TinyFish-only default | Oct 16, 2026 | +572 / −117 |
| #23 | Phase 10.4: enrichment source quality — domain lists, publisher aliases, block-domain, rules C/D, backtest | Oct 17, 2026 | +1058 / −84 |
| #25 | Enrich: exclude social domains server-side, tune rule D, surface snippet scarcity | Oct 17, 2026 | +86 / −31 |
| #26 | enrich: source-quality gate — flag content-farm domains, deny confirmed ones | Oct 17, 2026 | +328 / −15 |
Chapter 5: Context links, deep coverage and perspectives (Oct 17–20)
| PR | Title | Merged | Changes |
|---|
| #24 | Phase 11: background-and-context links for stories (origin=context) | Oct 17, 2026 | +3046 / −39 |
| #27 | context: fix coverage gap, per-domain cap, tighter same-event boundary | Oct 17, 2026 | +377 / −32 |
| #28 | context: fix skipped_context_budget starvation — cap 30→100/day, dry-run no longer consumes, panel shows remaining not merged | — | +106 / −14 |
| #29 | Context quality: same-event date rule, content-farm gate, opinion labels | Oct 19, 2026 | +856 / −69 |
| #30 | context: deterministic same-event signals + accurate reason attribution (phase 11.4) | Oct 19, 2026 | +598 / −96 |
| #31 | Docs: split README into a MkDocs site on GitHub Pages | Oct 19, 2026 | +4157 / −1099 |
| #32 | enrich: deep-coverage tier for multi-outlet stories | Oct 20, 2026 | +2841 / −97 |
| #33 | perspectives: per-source digests + 'how outlets differ' synthesis | Oct 20, 2026 | +2369 / −19 |
| #34 | context: planner-mode "Additional detail" (query_mode: planner) | Oct 20, 2026 | +2724 / −27 |
Chapter 6: Observability and the SQLite lock hunt (Oct 21–25)
| PR | Title | Merged | Changes |
|---|
| #35 | Phase 16: workflow observability — telemetry tables, Workflow page, story inspector | Oct 21, 2026 | +3797 / −52 |
| #36 | Phase 16.1: honest image-sweep status + per-reason telemetry | Oct 21, 2026 | +376 / −37 |
| #37 | images: treat duplicate key insert as cache hit, not a failure | Oct 21, 2026 | +138 / −6 |
| #38 | feed: fix 'N new stories' pill clipped height and scroll-to-bottom on click | Oct 21, 2026 | +23 / −2 |
| #39 | Phase 16.3: enrichment self-starts (pending-capacity gate, own scheduler job, watchdog, status) | Oct 22, 2026 | +694 / −11 |
| #40 | Fix SQLite write-lock contention: instrumentation, transaction splits, retry_locked | Oct 24, 2026 | +1099 / −203 |
| #41 | workflow: live pipeline visualizer strip + recent activity lane | Oct 24, 2026 | +245 / −6 |
| #42 | telemetry: per-story step log in the story inspector | Oct 24, 2026 | +1566 / −82 |
| #43 | db: fix write-txn caller capture — resolve real file:line:func instead of "?" | Oct 25, 2026 | +63 / −20 |
| #44 | Mark web-enrichment provenance on the story page | Oct 25, 2026 | +618 / −21 |