Repository navigation
Description
Summary
Epic for the PM stack coherence program, commissioned by Drew's full-stack review (2026-10-26 ~22:35 CDT). Drew owns the verdict this epic answers: the stack's beginnings exist, but it is "not easy to navigate or particularly coherent… the data is stale or only partially adopted." His requirements (the yardstick for every child):
- ONE single URL, mobile or desktop, to see ALL projects
- On it: quotas & usage; page health; issues that need his attention
- REMEDIATE / respond / basic triage from there — not read-only
- Queued + in-progress work clear: what would be picked up NEXT, what's being worked on, what's BLOCKED, what was DONE recently
- Hierarchy with rollups: roadmap item > epic > issue (not just issue level)
- The glued-together topology (services, ports, Kaneo vs the rest) documented ON the dashboard
Headline evidence from the review (2026-10-26 ~22:40 CDT, laptop + gh, cross-checked)
- /attention shows "Needs Drew (0)" while the published orchestration.json carries 11 NEEDS DREW items — tier source rejected (fix(aggregator/orchestrator): orchestration section rejected — provenance is an object, isOrchestrationSection requires a string #1110) with NO indication on the page
- Every footer falsely claims the orchestrator "has not published a section" (it publishes hourly; the aggregator rejects it)
- Board: 95 of 107 cards are Done — a completion log again
- Items layer: "fixtures for 172 ref(s) outside the pool" — fixture states wear live badges
- Pool: 139 items, 17 with no Area; Grist 23 rows vs 16 Project epics (spec wants 1:1)
- No health page, no staleness alerting, no triage write actions beyond comments (comments store still holds only the 3 demo comments from Oct 25)
- All services themselves were UP at review (aggregator/Kaneo/Postgres/Pad/Grist containers healthy; ready-for-agent, tunnel live) — the gap is coherence, not uptime
Children — information architecture & front door
- impl(aggregator): make / the stack front door - overview of all projects, attention, health, quotas (board moves to /board) #1134 front door: / becomes the stack overview
- fix(aggregator): navigation coherence - 10-item nav overflows on mobile, sub-pages undiscoverable #1135 navigation coherence + mobile nav
- impl(aggregator): deep-link every card/row out to its live service (Kaneo, Grist, Pad, ready-for-agent) #1136 deep-links out to Kaneo/Grist/Pad/ready-for-agent
- impl(aggregator): services & ports topology table on the dashboard - what runs where, bound how, consumed by whom #1137 services & ports topology table on the dashboard
- fix(aggregator): provenance footer is one jargon line and contradicts page content - replace with per-source freshness chips #1138 provenance footer -> per-source freshness chips
Children — data freshness, honesty, adoption
- fix(aggregator/orchestrator): orchestration section rejected — provenance is an object, isOrchestrationSection requires a string #1110 (pre-existing) orchestration section rejected: provenance shape
- fix(aggregator): /attention presents derived-only data as authoritative when the orchestration tier source is missing - banner + never a silent 0 #1139 /attention silent-0 honesty (banner, never derived-only as authoritative)
- fix(aggregator): health/footer misdiagnoses a rejected orchestration section as 'has not published' - distinguish absent vs invalid #1140 absent vs invalid diagnosis in /api/health
- impl(aggregator/collector): Project pool resolves a minority of board/roadmap refs (172 fixture fallbacks) - raise coverage and publish the ratio #1141 pool coverage for board/roadmap refs (172 fixture fallbacks)
- impl(orchestrator/project): Area-unset pool items (17) are invisible to per-project pages - triage pass + taxonomy check #1143 Area-unset triage (17 items)
- impl(pm-stack): reconcile Grist roadmap rows vs Project epics 1:1 and publish a drift check #1144 Grist <-> Project 1:1 reconciliation + drift check
- impl(dashboard): comments loop never exercised since the Oct 25 demo - verify triage/GitHub-post loop end-to-end and retire demo data #1145 comments loop end-to-end verification
- fix(aggregator): board is again a completion log - 95 of 107 cards are Done; age out / collapse done by default #1146 board Done composition (95/107)
Children — health & observability
- impl(aggregator): service & page health page - live probes for every stack service, feed ages, last runs #1147 service & page health page
- impl(fleet): staleness watchdog - surface dead/stale stack inputs as NEEDS ORCHESTRATOR instead of silent decay #1148 staleness watchdog -> NEEDS ORCHESTRATOR
- fix(pm-stack): aggregator install.sh does not restart a running service - deploys silently no-op #1150 install.sh deploy-restart fix
Children — triage & remediation (Drew acts from the dashboard)
- design+impl(aggregator): triage actions on /attention - acknowledge, snooze, escalate, answer - orchestrator-mediated #1152 triage actions on /attention (acknowledge/snooze/escalate/answer)
- impl(aggregator): 'request status change' action on project/board cards - orchestrator applies it as single writer #1154 request status change on cards (orchestrator applies as single writer)
- impl(aggregator): session actions from /sessions and /attention - poke, answer, stop - keeper/orchestrator-mediated #1156 session actions (poke/answer/stop, mediated)
Children — queue visibility & hierarchy
- impl(aggregator+orchestrator): Next-up view - what would be picked up next, in ladder order, across projects #1158 Next-up data contract (ladder order, cross-project)
- impl(aggregator): queue visibility views - in-progress, blocked, recently-done as first-class cross-project lists #1160 queue views: in-progress / blocked / recently-done
- impl(aggregator): one reconciled in-progress list - board lane, Project status, and session claims currently disagree #1162 one reconciled in-progress list
- impl(aggregator): epic-level rollups - pool has 16 Kind=Epic items but every page renders flat lists #1164 epic-level rollups (16 Kind=Epic items)
- impl(fleet/project): adopt native GitHub sub-issues + blocked-by for epic children (16 epics) instead of text-derived links #1166 native sub-issues + blocked-by adoption
- impl(aggregator): /roadmap drill-down - roadmap row expands to its epic, progress, and issues #1168 /roadmap drill-down to epic + progress
Children — quotas & usage
- fix(aggregator): quota pools carry no visible per-pool read age - stale manual reads look live #1170 per-pool read age / stale badges
- impl(aggregator): /quota covers 8 SaaS services; the tracked estate is dozens - list the uninstrumented with reasons #1172 quota coverage: the uninstrumented estate listed
- impl(aggregator): quota page shows numbers, not actions - surface expiring/cancelled-pool actions into /today + /attention #1174 quota actions surfaced into /today + /attention
Children — contracts, performance, access, hygiene
- impl(pm-stack): contract test suite for publisher -> collector -> aggregator schemas (the #1110 failure class) #1176 publisher->collector->aggregator contract tests
- impl(collector): feed sections fail silently (omitted on error) - publish per-section status in feed meta #1178 collector per-section status in feed meta
- fix(aggregator): heavy pages + per-request live fan-out - /projects 109KB, /sessions 100KB, / renders in ~0.7s, /today ~1.8s #1179 page weight / fan-out performance
- fix(aggregator): per-page mobile audit - tables, timelines, chips at 390px across all 10 pages #1180 per-page mobile audit (390px)
- fix(pm-stack): ready-for-agent binds 0.0.0.0:6056 while the rest of the stack binds loopback+tailnet - align bind scopes #1181 ready-for-agent bind scope alignment
- design(pm-stack): one public URL for the dashboard behind Cloudflare Access (settled access model, not yet implemented) #1182 one public URL behind Cloudflare Access (design; Drew's go required)
- chore(pm-stack): tracker hygiene - stale design issues #851/#852 still open though shipped; #781 predates the stack review #1183 tracker hygiene (design(aggregator): quota + throughput view — pooled quotas, resets, burn rates, model-choice support #851/design(aggregator): 'needs you' attention view — session state taxonomy, machine-first #852 zombies, pm-stack: Pad/Grist compose files hard-code one host's tailnet IP (100.99.113.103), breaking the documented move-hosts procedure #781)
Related programs (distinct epics, don't blur)
- epic(dashboard): per-project status pages for all projects — generalize /program beyond pm-dashboard #1129 — multi-project documentation pages (/program hub + per-project). This epic is the stack's own coherence/UX/health; epic(dashboard): per-project status pages for all projects — generalize /program beyond pm-dashboard #1129 is project documentation content.
- impl(aggregator+collector): complexity-weighted project visualization (rollup, hands queue, blocked weight, depth graph) #1122 — weighted visualization (consumes this epic's epic-rollup data work in impl(aggregator): epic-level rollups - pool has 16 Kind=Epic items but every page renders flat lists #1164/impl(fleet/project): adopt native GitHub sub-issues + blocked-by for epic children (16 epics) instead of text-derived links #1166)
- impl(fleet): work-picking jobs consult the orchestrator published priorities before choosing work #911 — work-picking jobs consult the orchestrator (consumes impl(aggregator+orchestrator): Next-up view - what would be picked up next, in ladder order, across projects #1158's published next-up)
Roadmap representation
This issue carries epic + now labels so the orchestrator's label-gated auto-add (#910 rules) picks it into org Project #4 as Kind=Epic; the Area must be pm-dashboard (set by whoever reconciles first pass if auto-add doesn't carry Area — tracked as part of #1143's taxonomy work). Grist "Program roadmap" rows 1-5 cover the ORIGINAL PM phases (complete); a row for this coherence phase is requested in #1144's reconciliation scope rather than written ad hoc.
Done when
All children closed: Drew opens one URL and sees every project, fresh data with honest ages, working triage, a true queue picture, epic rollups, and a health view — and staleness anywhere in the stack announces itself instead of decaying silently.
Acceptance criteria
- A single URL (mobile or desktop) shows all projects with quotas & usage, page health, and the issues that need Drew's attention — with no silent-zero or fixture-backed state presented as live.
- Triage is possible from that URL (remediate / respond / basic triage), not read-only, through the same audited action path as the rest of the stack.
- Queued + in-progress work is legible on the dashboard: what would be picked up next, what is being worked on, what is blocked, and what was done recently.
- Hierarchy renders with rollups (roadmap item > epic > issue), and the service/port topology (including Kaneo vs the rest) is documented on the dashboard.
- Every child issue listed in this epic is either closed with evidence or explicitly carried as a named remainder; the epic closes only when Drew's verdict — easy to navigate, coherent, fresh — can be answered yes from the dashboard itself.
Activity
developing-today commentedon Oct 27, 2026
CODE-320
113 remaining items
dezren39 commentedon Nov 2, 2026
Program tending — sub-issue progress (2026-11-02)
Closed since this thread's last activity: #1277 (closed 2026-11-01T23:31Z), #1284 (closed 2026-11-01T23:48Z), #1279 (closed 2026-11-02T13:06Z).
Recorded for the parent rollup; this is a progress note, not a completion proposal — the parent stays open on its remaining children.
dezren39 commentedon Nov 3, 2026
agent-note:v1
state: triaged (coverage pass)
Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 40 (priority/normal). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
Found via: coverage pass 2026-11-03
dezren39 commentedon Nov 3, 2026
🤖 Agent note · triage verdict: epic still live; its own rollup is stale (hand-maintained checklist 0/35 checked vs 25 children closed)
Verdict
Live — keep open. This is a program-tracking epic, not a code item; there is nothing to fix or close here. What triage can contribute is the rollup and the blockers, both of which currently diverge from reality.
Child rollup (fresh
ghreads of all 37 issue numbers in the body): 12 open, 25 closed.Defect in the epic itself: the body's "Children" checklist is entirely stale — 0 of 35 boxes are checked while 25 of those children are closed. An epic whose purpose is the hierarchical rollup currently reports the opposite of the truth to anyone reading it, which is the same coherence failure the epic was filed to fix.
Blockers / ordering
saas-extract.ts), fix(pm-stack): keep roadmap rows visible and validate horizons (#1207) #3958 (Roadmap: normalise horizon vocabulary and add per-theme progress rollups at every grain #1207, conflicts inrender.ts). Two are now unmergeable as-is. Filed as queue: coverage join ignores open fix PRs — issues get re-triaged while their PRs bit-rot (#941, #1204, #1207) #4951 with the coverage-join/merge-watch recommendation.Recommendation