Skip to content

feat(aggregator): Today answers both daily questions — add the system strip (health + feed ages) to /today #1501

Closed

Description

@dezren39

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 /today without visiting /health or /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

  1. developing-today commented on Oct 27, 2026

    @developing-today
    Contributor
  2. added
    app/pm-stackpm-stack (Pad/Grist) in developing-today/code
    effort/mMedium: expected under 1 day of work
    source/humanFiled directly by a human
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 27, 2026
  3. dezren39 commented on Oct 27, 2026

    @dezren39
    MemberAuthor

    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 ## Acceptance section 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 cached healthContext() view (60s probes, no new fan-out); strip renders in both renderTodayShell and renderTodayBody; check the 390px two-row wrap.

    🤖 Agent note · filed

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: repo-fleet-monitor run 2026-10-27 14:19 CDT — intake enrichment (protocol §5)
    • Found via: monitor reconciliation
    • Task: Add a one-row system strip (services, feed age, orchestrator age, quota errors) under Today's H1, in shell first paint and full/fragment renders, reusing the existing health assembly.
    • Expectation: intake only this run — labels normalized, liveness checked, acceptance criteria in place; the fix itself routes through the normal queue/sweep path
    • Links: n/a
  4. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed on Nov 1, 2026
  5. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

    • Agent: repo-worker-code (openchamber-scheduled-lane)
    • Task: triage queue task 2596
    • Next: verify current main and ownership.
  6. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · triage verdict

    • Agent: repo-worker-code; task 2596.
    • Verdict: outstanding at main 879b948f2: server.ts:375–384 builds Today context without health and server.ts:562–569 passes no health to shell/fragment. render.ts:2603–2619 has no system strip. No matching open PR found.
    • Next: route a fail-soft health strip for first paint and full/fragment views with feed ages, quota errors and narrow-screen tests.
  7. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done

    • Agent: repo-worker-code; triage task 2596 completed.
    • Outcome: missing strip confirmed; implementation follow-up queue task 5012 is queued. Issue remains open.
  8. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

    • Agent: repo-worker-code (openchamber-scheduled-lane)
    • Task: implementation queue task 5012
    • Next: verify issue/PR ownership, then create a dedicated worktree and implement the cached fail-soft Today health strip.
  9. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done

    • Agent: repo-worker-code (openchamber-scheduled-lane)
    • Task: implementation queue task 5012
    • Outcome: PR feat(aggregator): Today system health strip (#1501) #4018 opened with the Today health strip in shell, full, and fragment renders; targeted tests pass.
    • Next: CI and review continue on the PR.
  10. added a commit that references this issue on Nov 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/pm-stackpm-stack (Pad/Grist) in developing-today/codeeffort/mMedium: expected under 1 day of workkind/featureNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)source/humanFiled directly by a human

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions