Skip to content

pm dashboard /roadmap: integrate the repos' own roadmap files (ROADMAP.md, planning/roadmaps/*.md) alongside the Grist table #1738

Open

Description

@dezren39

Gap

The /roadmap page is fed only by a hand-maintained Grist table (doc "Program roadmap", read by sources/live.ts gristRoadmap). The repos' own roadmap records are invisible to the dashboard:

  • dezren39/nix has ROADMAP.md (with its Done table, maintained by fleet jobs).
  • developing-today/code keeps program roadmaps under planning/roadmaps/ (e.g. planning/roadmaps/id.md is the id program's record) plus .opencode/plans/ phase files.
  • The Oct 26 dashboard review found the Grist roadmap held 16 rows with ZERO id rows, while ~68 id issues were open — the hand-kept table drifts from the repo records.

Related but different in scope: code#1216 (add PM stack rows to the code repo's ROADMAP.md / planning files) and code#1352 (program tending). This issue is the dashboard READ side: surface what the repos already record.

What to build

  • A roadmap source in the aggregator that reads the repos' roadmap files from the laptop's primary checkouts (the aggregator already deploys from ~/git/code): ROADMAP.md files and planning/roadmaps/*.md, parsed into RoadmapRow-shaped records (title, area/project, status, horizon when stated, source file + heading anchor as the link).
  • Merge with the Grist rows on /roadmap and /api/roadmap.json: each row shows its source (grist vs repo file); repo-derived rows link back to the file/heading.
  • Dedup rule: when a Grist row and a repo section describe the same roadmap item (title/area match), prefer the repo row and note the Grist duplicate in provenance rather than showing both.
  • Per code#1500's rule, the page must say why a section is empty (file missing vs parse-empty vs source unreadable).

Acceptance

  • /roadmap shows rows derived from at least the code repo's planning/roadmaps/*.md and the nix repo's ROADMAP.md, with source labels and working links.
  • The id program appears on the dashboard roadmap from its repo record without any hand entry.
  • Grist rows still render; duplicates are collapsed per the rule above; the /api twin matches the page.

Raised by Drew 2026-10-28 ("does roadmap integrate roadmap.md files?" — currently no); companion to the PM event-log issue filed the same day.

Acceptance criteria

  • /roadmap and /api/roadmap.json show rows derived from at least the code repo's planning/roadmaps/*.md and the nix repo's ROADMAP.md, with source labels and working links back to the file/heading.
  • The id program appears on the dashboard roadmap from its repo record without any hand entry.
  • Grist rows still render; duplicates are collapsed preferring the repo row with the Grist duplicate noted in provenance; any empty section says why (file missing vs parse-empty vs source unreadable).

Activity

  1. added
    enhancementNew feature or request
    nextOrg Project gate: queued next — orchestrator adds to the board
    on Oct 28, 2026
  2. developing-today commented on Oct 28, 2026

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

    @dezren39
    MemberAuthor

    Direction correction (Drew, 2026-10-28): the requirement is NOT primarily that /roadmap reads the Markdown files. The requirement is that all roadmap planning files are automatically synced — Grist table, ROADMAP.md files, planning/roadmaps/*.md, and any other roadmap home — so no source drifts from the others. Whether the dashboard should then READ the synced Markdown (vs keep reading Grist) is an implementation choice that needs a design pass before building: options include (a) sync engine keeps every store current and each consumer reads its native store, (b) one canonical store with the others as generated views, (c) read-through in the aggregator. The interim 4-hourly sync task (cron roadmap-sync-grist-md, first run 2026-10-28 ~16:13 CDT) covers the sync requirement operationally until this design lands. Acceptance updated: a design record comparing the options lands FIRST and is linked here; the build follows the design, not this issue's original framing.

  4. added
    source/humanFiled directly by a human
    priority/normalOrdinary priority (the default)
    effort/mMedium: expected under 1 day of work
    app/pm-stackpm-stack (Pad/Grist) in developing-today/code
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 28, 2026
  5. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    Intake review

    Related: #1216 (PM-stack rows in the code repo's own ROADMAP/planning files — write side; this issue is the dashboard read side), #1352 (program tending), #1744 (shared schema), #1739 (event log, companion filed the same day).

    Notes: Verified still live at intake (2026-10-28T17:45Z): /roadmap is still Grist-only per the body (sources/live.ts gristRoadmap); no PR adds a repo-files roadmap source. The drift evidence is concrete (16 Grist rows, zero id rows vs ~68 open id issues). Acceptance criteria section appended formalizing the body's ## Acceptance list; original body preserved above it.

    Risks: Title/area matching for dedup is fuzzy — a bad match could hide a legitimately distinct Grist row; provenance note (per the body's rule) is the mitigation, keep it visible. Parsing two different roadmap formats (nix ROADMAP.md tables vs code planning/roadmaps/*.md) may need per-format parsers.

    Suggested approach: Start with the code repo's planning/roadmaps/*.md (the aggregator already deploys from ~/git/code), prove the id program appears, then add nix ROADMAP.md, then the dedup pass.

    🤖 Fleet monitor intake enrichment · 2026-10-28

  6. added
    work/assignedQueue worker lifecycle state
    and removed on Nov 1, 2026
  7. 20 remaining items

  8. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: pr_opened
    task: 5037 (repo-health-code-pilot; worker repo-worker-code; OpenChamber scheduled lane 335a5d1f-bfc1-4831-99ea-850c8939a727)
    state: design record submitted for review.
    artifact: Roadmap homes synchronization design
    PR: #4833 — OPEN against main. No dashboard or sync implementation is included.
    validation: document-only; git diff --cached --check passed. Fresh PR checks currently show CodeRabbit NEUTRAL and no other check yet; CI will be rechecked.
    resume: review PR checks; keep the proposed Grist authority and generated-view policy subject to Drew’s explicit decisions in the design.

  9. added
    user/reviewNeeds a user-look: Muse reviews first and handles what it can
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 3, 2026
  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: done
    task: 5037 (repo-health-code-pilot; worker repo-worker-code; OpenChamber scheduled lane 335a5d1f-bfc1-4831-99ea-850c8939a727)
    result: Design-only PR #4833 opened against main and the note linked on #1738. The record compares all three options, recommends a canonical-store/generated-view approach with Grist as a candidate pending Drew confirmation, and specifies identity, conflicts, freshness, rollout, and open decisions. No implementation or dashboard change.
    validation: git diff --cached --check passed. This prose-only change is class 0 under .github/ci-policy.md; no PR-tier test was required. Fresh PR state: OPEN; only CodeRabbit reported skipping, with no pending CI checks.
    interim sync: #1738 documents the 4-hour schedule, but its current deployment/health could not be verified in the source repos or laptop user systemd; the note records this as unknown.
    labels: user/review added; queue/status/work claim labels removed. Bookkeeping deferred to fleet reconciliation.

  11. added
    queue/queuedHas a queued task in the Supabase agent queue
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  12. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    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

  13. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  14. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · triaged

    Verdict: still live, not implemented (checked at main bb592a618)

    What exists today. /roadmap is fed by two sources, both non-file: Grist's "Program roadmap" rows plus the org Project pool's Kind=Epic items, joined by pm-stack/aggregator/src/roadmap-reconcile.ts (header: "Grist roadmap ↔ Project epic reconciliation (#1144)"). roadmap-annotations.ts adds commentary on top. Neither reads a markdown roadmap file.

    What the issue asks for and is missing. A source that parses the repos' own records into RoadmapRows and merges them into /roadmap and /api/roadmap.json, with a Grist/repo dedup rule. git grep for planning/roadmaps/ROADMAP.md inside pm-stack/aggregator/src finds only project-config.ts, where they appear as homeDoc links on project pages (e.g. planning/roadmaps/basement-cluster.md, id.md, repo-and-ci.md, mcpx.md) — i.e. the dashboard already knows those files exist, but no parser turns them into rows.

    The records to read do exist (verified in the checkout): repo root ROADMAP.md; planning/roadmaps/{id,mcpx,nixos-and-infra,repo-and-ci,basement-cluster,basement-cluster-electrician-brief}.md; planning/templates/roadmap-item.md.

    Scoped fix path (three pieces, in this order)

    1. Parser (new, inert): a roadmap-files.ts that reads ROADMAP.md + planning/roadmaps/*.md and emits RoadmapRow-shaped records (title, area/project from the file or heading, status, horizon when stated, link = file path + heading anchor). Unit-test against the real files plus a fixture, matching roadmap-reconcile.test.ts style.
    2. Merge + dedup: extend the read path so each row carries source: grist | repo, prefer the repo row when title/area match, and keep the Grist duplicate as a noted annotation rather than dropping it silently — the same "surface both readings" posture project-config.ts already argues for.
    3. Render + API: /roadmap badges the source and links a repo row to its file/anchor; /api/roadmap.json publishes the same field, so roadmap-reconcile's drift counts keep working.

    Blockers / ordering to record before work starts

    • Cross-repo checkout path is unverified here. The issue says the aggregator reads the laptop's primary checkouts, but this machine has no ~/code/dezren39-nix (the nix ROADMAP.md the issue cites was not readable), while ~/git/code is present. Decide the checkout root(s) and behaviour when a repo is absent (skip with a stated reason vs fail the read) before writing the parser.
    • Dedup rule needs an owner decision (repo wins, Grist wins, or surface both). The issue leans "prefer repo", but it changes what /roadmap shows for existing rows, so it belongs with the roadmap's owner.
    • Scope overlap, not duplication: docs(roadmap): add the PM stack as a top-level roadmap project (ROADMAP.md row + planning/roadmaps/pm-stack.md) #1216 (add PM-stack rows to code's roadmap files) and Program tending: scheduled care for roadmaps, epics, projects, and stalled PRs #1352 (program tending) write the files; this issue only reads them. Land this read independently — it does not need those.
    • No live implementation task exists. The issue carries next, effort/m and user/review, and a design-sized read-path change is not a small_fix, so no fix packet was enqueued from this triage.
  15. added
    status/triagedTriaged and routed (see agent note)
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 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 workenhancementNew feature or requestkind/enhancementmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addednextOrg Project gate: queued next — orchestrator adds to the boardpriority/normalOrdinary priority (the default)source/humanFiled directly by a humanstatus/triagedTriaged and routed (see agent note)task/triageQueue packet kind: verify, reproduce, and route this itemuser/reviewNeeds a user-look: Muse reviews first and handles what it can

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions