Repository navigation
Description
Problem (observed live, 2026-10-27)
Drew's two daily questions are "what needs me?" and "is everything healthy?". Today answers only the first.
Field evidence (aggregator live, ~13:56 CDT): /today?full=1 contains the NEEDS DREW / NEEDS USER counts, but zero health signal — no degraded-service, feed-age, or stack-state content anywhere in the render (src/render.ts's Today path has no reference to the health assembly at all). If Kaneo, the fleet-feed collector, or the orchestration pass dies, Today looks identical; the only place that shows it is /health. Meanwhile /api/health already assembles everything needed in one view: services[] with per-service state, degraded, feed generatedAt/fileMtime, section ages — computed, cached (60 s probes), and unused by the landing page.
Design
A one-row system strip directly under Today's H1, in both the shell (first paint — it is the glanceable answer) and the full/fragment render:
- Services:
stack 8/8 up— or the down/degraded service names in the warning colour, linking to/health. - Feed age:
feed 4m(warning state past 15m), linking to/health. - Orchestration age:
orchestrator 39m, linking to/health. - Quota read errors: count when > 0 (today: 2 provider reads sit in error state in
/api/quota.json), linking to/quota.
Each cell is one glanceable token; the strip adds no new data source — it renders the health assembly's existing outputs where Drew actually lands. Mobile: the strip wraps to at most two rows at 390 px.
Implementation path
todayContext() in src/server.ts gains the health view (the same healthContext() /health and /api/health use — probe results are already 60 s-cached, so this adds no per-request fan-out); renderTodayShell / renderTodayBody in src/render.ts render the strip from it. Fail-soft like every other facet: if the health assembly errors, the strip renders its own unknown state rather than breaking Today.
Acceptance
- All services up + fresh feed: the strip reads green in one line on
/today(shell and full render). - Any service down/degraded, feed > 15m old, or a quota pool in error state: the strip names it on
/todaywithout visiting/healthor/quota. - Strip present in first paint (shell), not only after the fragment lands.
Part of epic #1184 (PM stack coherence). Related: #1147 (built the health assembly this reuses), #1260 (freshness SLOs — the strip is the human surface for the same states).
Activity
developing-today commentedon Oct 27, 2026
CODE-566
dezren39 commentedon Oct 27, 2026
Intake review
Related: epic #1184, #1147 (health assembly), #1260. Liveness: no merged PR adds health signal to Today — checked merged aggregator PRs through 2026-10-27; issue is live. Its
## Acceptancesection is complete in substance, so no duplicate was appended.Notes / risks / suggested approach: Risk: fail-soft is mandatory — a health-assembly error must render the strip's own unknown state, never break Today. Suggested approach:
todayContext()gains the cachedhealthContext()view (60s probes, no new fan-out); strip renders in bothrenderTodayShellandrenderTodayBody; check the 390px two-row wrap.🤖 Agent note · filed
dezren39 commentedon Nov 1, 2026
🤖 Agent note · picked up
dezren39 commentedon Nov 1, 2026
🤖 Agent note · triage verdict
879b948f2:server.ts:375–384builds Today context without health andserver.ts:562–569passes no health to shell/fragment.render.ts:2603–2619has no system strip. No matching open PR found.dezren39 commentedon Nov 1, 2026
🤖 Agent note · done
dezren39 commentedon Nov 1, 2026
🤖 Agent note · picked up
dezren39 commentedon Nov 1, 2026
🤖 Agent note · done
Merge pull request #4018 from developing-today/queue/5012-1501-today-…