Skip to content

fix(aggregator): provenance footer is one jargon line and contradicts page content - replace with per-source freshness chips #1138

Closed

Description

@dezren39

Finding

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.

Activity

  1. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    task/small-fixQueue packet kind: bounded fix with reproduction and targeted tests
    app/pm-stackpm-stack (Pad/Grist) in developing-today/code
    on Oct 27, 2026
  2. developing-today commented on Oct 27, 2026

    @developing-today
    Contributor
  3. dezren39 commented on Oct 27, 2026

    @dezren39
    MemberAuthor

    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).

  4. added 2 commits that reference this issue on Oct 27, 2026
  5. dezren39 commented on Oct 27, 2026

    @dezren39
    MemberAuthor

    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.
    • 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.

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/codekind/bugSomething isn't working (prefixed form of the classic bug label)status:donetask/small-fixQueue packet kind: bounded fix with reproduction and targeted tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions