Repository navigation
Closed
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codekind/featureNew feature or capability requestNew feature or capability requestpriority/normalOrdinary priority (the default)Ordinary priority (the default)status:done
Description
What
Add a program status / roadmap page to the PM aggregator (pm-stack/aggregator/) at route /program (id program, title "Program status", JSON twin /api/program.json).
The dashboard documents Drew's work live, but nothing on the dashboard documents the dashboard/PM program itself — its status, what's built, what's next, and the long-term roadmap live scattered across the design record, issues #898/#899/#906/#910/#911, the org Project README, and agent memory. Drew asked for this page in chat (2026-10-26) after a status review.
Spec
Follows the pluggable-page recipe (#906 §1, README "Pages are pluggable"):
- One
PAGESentry insrc/pages.ts; render function insrc/render.ts; route +/api/program.jsontwin insrc/server.ts. No newSourcefacet needed — the page derives fromsource.items(),source.projects(), andsource.orchestration(), all of which have fixture twins. - Editorial content lives in ONE new module
src/program.tsexporting a structuredPROGRAMobject (architecture / done / next / long-term / known gaps, each entry carrying its tracker refs + links), so future edits are one file. - Sections: (1) what this is / architecture (GitHub = source of truth; org Project Bump build/buck/preludes/buck2-prelude from
3a02ea3to9530656#4 = canonical layer; hourly orchestrator impl(orchestrator): recurring orchestration job — queue triage, priority ladder, blocker awareness, goal measurement #899 = single writer of Project status; Kaneo / ready-for-agent / Pad / Grist / projector+link registry; aggregator = read-mostly, disposable projection) with links to the design record and Project Bump build/buck/preludes/buck2-prelude from3a02ea3to9530656#4; (2) what's built (foundation + Wave 3, slices 1–3 feat(aggregator): slice 1 — live needs-you + quota panels (fleet feed + laptop server) #892/impl(aggregator): slice 2 — mobile, needs-Drew/needs-orchestrator tiers, time-granular roadmap, session clarity #898/impl(orchestrator): recurring orchestration job — queue triage, priority ladder, blocker awareness, goal measurement #899/impl(dashboard): slice 3 — pluggable pages (DNS register first), comments everywhere, agent/session identity registry #906, Oct 26 fixes PRs Fix /today 500: tolerate string-shaped progressedSinceLastRun #989–fix(aggregator): collector egress proxy env (projects section was silently omitted under the systemd unit) #992/fix(aggregator): dated Meta charge incidents + truthful Meta blocked note (charges 22.89 → 42.89) #994, org Project design+impl: org-level GitHub Project as the conceptual-project layer — orchestrator-synced, dashboard-read #910 all 6 stages); (3) live status, derived not hard-coded: tracked-issues table (impl(aggregator): slice 2 — mobile, needs-Drew/needs-orchestrator tiers, time-granular roadmap, session clarity #898, impl(orchestrator): recurring orchestration job — queue triage, priority ladder, blocker awareness, goal measurement #899, impl(dns-registry): recurring DNS backup job, renewal/cost tracking, dashboard view of the domain register #902, impl(dashboard): slice 3 — pluggable pages (DNS register first), comments everywhere, agent/session identity registry #906, design+impl: org-level GitHub Project as the conceptual-project layer — orchestrator-synced, dashboard-read #910, impl(fleet): work-picking jobs consult the orchestrator published priorities before choosing work #911 viasource.items(), unresolved refs render as "unresolved"), Project pool summary (counts by Status and Area, fromsource.projects(), link to/projects), orchestration freshness (generatedAt/runIdfromsource.orchestration(), null handled); (4) what's next (impl(fleet): work-picking jobs consult the orchestrator published priorities before choosing work #911; GitHub comment projection still on fixtures; Project Roadmap Start/Target dates not yet set on items); (5) long-term roadmap (ops console via pluggable pages, Area-filtered Project splits, deeper Kaneo fork, Cozystack/k8s move); (6) known gaps, stated honestly (Muse sessions: launch-records only, no runtime registry; comment projection fixture). /api/program.jsonreturns the same structured object plus the live sections.- README:
/programrow in the views table +program.tsin the layout file list. - Tests (
test/program.test.ts, bun:test, fixture source): PAGES entry correctness; render contains section headings, a tracked-issue ref, next/long-term items; the data builder handles empty pool / absent items / null orchestration. Fullbun test+bunx tsc --noEmitgreen.
Acceptance
- PR merged to main (merge commit)
- Deployed to the laptop aggregator via
pm-stack/aggregator/install.sh - Live-verified:
/programand/api/program.json200 with expected content on the tailnet URL;/,/today,/projectsstill 200
Metadata
Metadata
Assignees
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codekind/featureNew feature or capability requestNew feature or capability requestpriority/normalOrdinary priority (the default)Ordinary priority (the default)status:done
Activity
developing-today commentedon Oct 27, 2026
CODE-191
dezren39 commentedon Oct 27, 2026
Picked up — 2026-10-26
Implementation in progress on branch
pm/program-page(worktree~/git/wt-program-page), PR: #1060Local verification before opening the PR:
bun test136 pass / 0 fail (incl. newtest/program.test.ts),bunx tsc --noEmitclean, fixture-server smoke:/program200 +/api/program.json200 with all sections. Deploy + live verification to follow the merge.style(pm-stack/aggregator): treefmt (biome + prettier) formatting for #…
dezren39 commentedon Oct 27, 2026
Done — merged + deployed + live-verified 2026-10-26
24d34481c7ec52957748596b1556e1a2b394ef51(merge commit, verified on origin/main). CI: treefmt + Nix flake evaluation + run all pass (first treefmt run failed on formatting; fixed with biome/prettier — byte sizes of the formatted files match CI's expected output exactly).bun test136 pass / 0 fail (newtest/program.test.ts: manifest entry, builder empty-pool/absent-items/null-orchestration, pool counts + freshness, render smoke from fixtures);bunx tsc --noEmitclean.~/codepulled to the merge commit (tracked tree clean before pull),pm-stack/aggregator/install.shrun on the laptop. NOTE: install.sh'ssystemctl --user enable --nowdid not restart the already-running unit, so the first check 404'd; an explicitsystemctl --user restart pm-aggregator.servicewas required — worth a follow-up fix to install.sh./program200,/api/program.json200,//today/projects/pagesall 200. Live content: tracked issues resolve from the pool — impl(aggregator): slice 2 — mobile, needs-Drew/needs-orchestrator tiers, time-granular roadmap, session clarity #898/impl(orchestrator): recurring orchestration job — queue triage, priority ladder, blocker awareness, goal measurement #899/impl(dashboard): slice 3 — pluggable pages (DNS register first), comments everywhere, agent/session identity registry #906/design+impl: org-level GitHub Project as the conceptual-project layer — orchestrator-synced, dashboard-read #910 closed, impl(dns-registry): recurring DNS backup job, renewal/cost tracking, dashboard view of the domain register #902 open, impl(fleet): work-picking jobs consult the orchestrator published priorities before choosing work #911 renders 'unresolved' (not in the Project pool and the projector is off in this deployment); pool summary live: 45 items (Todo 27 · Done 10 · unset 6 · In Progress 1 · In Review 1; pm-dashboard 13 · fleet-ops 9 · lab-cluster 8 · id-train 4).Pre-existing finding (not caused by this PR): the current fleet feed's orchestration section carries
provenanceas an object, whileisOrchestrationSection(src/feed.ts) requires a string — so the section is rejected and/api/orchestration.jsonreports 'absent' and /today derives. The /program freshness card reflects the same state ('no orchestration section in the current feed yet') and will light up automatically once the publisher/check contract drift is fixed. Flagged here so it doesn't sit silently.