You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(aggregator): provenance footer is one jargon line and contradicts page content - replace with per-source freshness chips #1138
Evidence (live review 2026-10-26 ~22:40 CDT, laptop loopback + gh, cross-checked): Every page footer is a single run-on line ("board: live (Kaneo) - roadmap: live (Grist) - items: live (project pool - fleet feed - 3m old) + fixtures for 172 ref(s) outside the pool - comments: fixtures - quota: live ... - registry: live (61 records merged - feed 3m old)"). Problems: (1) unreadable, especially on mobile; (2) it can contradict the page - the /sessions header says "219 records" while the footer on the same page says "61 records merged" (61 = feed-section count, 219 = merged total; nothing explains that); (3) key facts (orchestration missing) are buried mid-line.
Proposal
Per-source freshness chips near the top of each page (source, age, live/fixture/stale state, only for sources that page uses), generated from the same Provenance data; footer shrinks to the tailnet link. Counts shown anywhere must name what they count.
Acceptance
No page shows two unexplained counts for the same noun.
Chips render per page with only that page's sources; tests assert chip content from fixture provenance.
Agent note (pickup): building the honesty + freshness slice of epic #1184 in one PR — this issue (banner + unknown counts + dead-man's-switch half of #1148), #1138 (freshness chips), #1267 (health priming). Design: ~/workspace/pm-stack-coherence-design-2026-10-26.md cluster 1. The PR also carries the role-based copy change (visible "Needs Drew" → "Needs user"; contract field names untouched).
Chips render at the top of <main> for exactly the sources each page uses: board (board/items/orchestration), roadmap (roadmap/items), quota + service detail (quota/usage), attention (orchestration/attention/registry), today (orchestration/quota/attention), dns (dns), sessions (registry), projects (items), program hub + project pages (orchestration/items/roadmap). Chip format: source · state · <count> <noun> · <age> — counts always travel with their noun, and a chip's count and the page header's count for the same thing read the same variable.
The ten-string footer provenance line moves into a collapsed <details> "source detail" disclosure; the tailnet endpoint line stays visible. (Deviation from the design sketch, deliberately: the footer keeps the MagicDNS name, not the raw tailnet IP — house rule.)
Registry count fixed: the facet string and chip now headline the merged store total — live (221 session records · 61 from the latest feed · feed <age>) — the same variable /sessions renders in its header. One name ("session records"), one number, contributions labelled; the 221-vs-61 disagreement is gone by construction, and a unit test pins the merged-total + noun contract.
Verification: bun test 181 pass / 0 fail (new chip tests: merged count with noun, per-page chip selection, no-detail back-compat), bunx tsc --noEmit clean, CI green.
Activity
developing-today commentedon Oct 27, 2026
CODE-275
dezren39 commentedon Oct 27, 2026
Agent note (pickup): building the honesty + freshness slice of epic #1184 in one PR — this issue (banner + unknown counts + dead-man's-switch half of #1148), #1138 (freshness chips), #1267 (health priming). Design: ~/workspace/pm-stack-coherence-design-2026-10-26.md cluster 1. The PR also carries the role-based copy change (visible "Needs Drew" → "Needs user"; contract field names untouched).
feat(aggregator): honesty + freshness — no silent zeros, primed healt…
Merge pull request #1318 from developing-today/pm/honesty-freshness
dezren39 commentedon Oct 27, 2026
Agent-note (completion): shipped in PR #1318 (merge
b8aedf09), closing this issue.What landed
Source.provenanceDetail()returns structured per-facet detail —{ text, state: live|fixtures|stale|absent|invalid, ageMs?, count?, countLabel? }. State derives from the facet's own maintained provenance string, sharpened by two facts strings can't carry: the orchestration diagnosis (fix(aggregator): /attention presents derived-only data as authoritative when the orchestration tier source is missing - banner + never a silent 0 #1139) and the feed's age — a "live" facet over a feed older than 15 min (impl(fleet): staleness watchdog - surface dead/stale stack inputs as NEEDS ORCHESTRATOR instead of silent decay #1148's threshold) renders stale.<main>for exactly the sources each page uses: board (board/items/orchestration), roadmap (roadmap/items), quota + service detail (quota/usage), attention (orchestration/attention/registry), today (orchestration/quota/attention), dns (dns), sessions (registry), projects (items), program hub + project pages (orchestration/items/roadmap). Chip format:source · state · <count> <noun> · <age>— counts always travel with their noun, and a chip's count and the page header's count for the same thing read the same variable.<details>"source detail" disclosure; the tailnet endpoint line stays visible. (Deviation from the design sketch, deliberately: the footer keeps the MagicDNS name, not the raw tailnet IP — house rule.)live (221 session records · 61 from the latest feed · feed <age>)— the same variable /sessions renders in its header. One name ("session records"), one number, contributions labelled; the 221-vs-61 disagreement is gone by construction, and a unit test pins the merged-total + noun contract.Verification:
bun test181 pass / 0 fail (new chip tests: merged count with noun, per-page chip selection, no-detail back-compat),bunx tsc --noEmitclean, CI green.