truthful-plan-surfaces — The plan's surfaces are inferred from delivery, and nothing they show is typed beside the repository
Every plan surface draws every milestone in the graph's order, each issue with its declared status beside the delivery stage inferred from branches, pull requests, merges, tags and the published site; a merged but unrecorded issue turns the trunk red past a window; no milestone carries a typed version; every relationship is a drawn, clickable diagram; every code block is highlighted by one engine with one token-derived palette.
ACTIVE 13 of 23 issues done
- ready
- 9
- blocked
- 1
- active
- 0
- verify
- 0
- done
- 13
- cancelled
- 0
Problem
Measured 2026-10-16 at master d1162668036 (v0.27.0): /roadmap/ lists 8 of 38 milestones, the ones with a hand-typed version 0.1-1.0; issue status is derived from stamps only and nothing compares it with merged work (I2653 merged by #1097 still READY); /ui/roadmap said latest release 0.26.0 under a 0.27.0 header; the landing page states the present in hand-written toml prose; box art survives outside the diagram rule's scope; code is highlighted by three engines, one fetched from a CDN. ADR 0166.
Outcome
Every plan surface draws every milestone in the graph's order, each issue with its declared status beside the delivery stage inferred from branches, pull requests, merges, tags and the published site; a merged but unrecorded issue turns the trunk red past a window; no milestone carries a typed version; every relationship is a drawn, clickable diagram; every code block is highlighted by one engine with one token-derived palette.
Current state
Status from stamps; roadmap filtered by a hand field; landing prose hand-written; three highlighters; diagram rule covers docs, site sources and templates only.
Desired state
plan.delivery and plan.drift capabilities; version inferred from tags; /roadmap/, /plan/, landing page, /ui/roadmap and PLAN_STATUS.md read one derivation; homepage-check refuses present-state prose; diagram rule v2 over ADRs, rules, handbook and UI markdown; syntect everywhere.
Scope
- apps/majordomus-cli/src/plan.rs
- apps/majordomus-cli/src/capability/builtin/plan.rs
- apps/majordomus-cli/src/ui
- apps/majordomus-cli/src/web
- lib/project.awk
- lib/project.sh
- lib/plan.sh
- scripts/generate-site-data
- scripts/ci
- site/templates
- site/content-src
- site/data
- share/ui
- share/design
- share/schemas
- handbook
- .ai/repo/project/milestones
- .ai/repo/rules/project
- .ai/repo/adrs
- docs/PLANNING.md
- docs/DIAGRAMS.md
- test/cases
Out of scope
- Writing lifecycle stamps from inference; a merge is not acceptance and evidence still decides DONE (ADR 0166, alternatives).
- Rewriting the awk status engine; delivery is Rust only.
Acceptance criteria
- plan.delivery answers a stage with its proving object for every issue, and an unread forge is reported as unread
- The trunk's ci refuses an issue merged and unrecorded past the declared window, naming the command that settles it
- No milestone record carries version, and the schema refuses one
- /roadmap/ and /ui/roadmap list every milestone of the plan in the graph's order, with the inferred stage of each issue linked to its proof
- homepage-check refuses a present-state sentence in site/data
- The diagram gate covers ADRs, rules, the handbook and UI markdown, and finds no box art
- One highlighter: no highlight.js and no CDN highlighter on any surface, and a gate refuses one
Validation
- bin/majordomus plan validate
- bash test/run.sh 3100_an_issue_delivery_is_inferred 3101_merged_work_unrecorded_is_drift 3102_a_milestone_version_is_inferred 3103_the_roadmap_draws_every_milestone 3104_the_ui_roadmap_reads_delivery 3105_the_homepage_states_no_present_it_does_not_read 3106_every_published_tree_draws_its_diagrams 3107_one_highlighter
Evidence required
- delivery_inferred
- drift_gated
- surfaces_read_one_derivation
- diagrams_and_code_unified
Risks
- The drift gate turns the trunk red on landing for every issue already merged and unrecorded; I2748 records them before the gate is made blocking.
- syntect adds to the executable's build time and size; measured in I2747 before it lands.
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I2740 | DONE | 0 | — | An issue's delivery is inferred from branches, pull requests, merges, tags and the published site |
| I2741 | DONE | 1 | I2740 | Merged work the plan has not recorded is drift, and on the trunk past a window it is red |
| I2742 | DONE | 0 | — | A milestone's version is inferred from the release that carried it, never typed |
| I2743 | READY | 1 | I2740, I2742 | The public roadmap draws every milestone in the graph's order, each issue with its inferred delivery |
| I2744 | READY | 1 | I2740 | The UI roadmap reads delivery and the releases themselves, and its now is where work is |
| I2745 | DONE | 0 | — | The landing page states no present it does not read |
| I2746 | DONE | 0 | — | Every published tree draws its diagrams, and every diagram is the interactive viewer |
| I2747 | READY | 0 | — | Every code block on every surface is highlighted by one engine with one palette |
| I2748 | BLOCKED | 3 | I2741, I2749, I2750 | The drift already on the trunk is settled before the gate is made blocking |
| I2749 | READY | 2 | I2741 | A commit that only plans an issue is not its delivery |
| I2750 | READY | 2 | I2741 | The trunk's drift gate reads the forge before it judges |
| I2850 | DONE | 0 | — | the published PR Drain carries its pull requests, and counts pull requests rather than plan issues |
| I2851 | READY | 1 | I2740 | the homepage's product view counts the delivery the history proves beside the statuses the records declare, each count a link |
| I2852 | DONE | 0 | — | every class a UI screen gives an element is one the UI's stylesheet defines |
| I3020 | DONE | 0 | — | The Knowledge screen states nothing about the repository that its checkout could not observe |
| I3021 | DONE | 0 | — | The Knowledge screen shows each review command as code with what it does as a sentence |
| I3022 | DONE | 0 | — | An empty knowledge queue is one sentence that says how a record arrives, not two empty tables |
| I3023 | DONE | 0 | — | The Knowledge screen reads in review order, in plain labels, and leads to the knowledge manual |
| I3024 | DONE | 0 | — | The Knowledge screen's manual link names a page the site has, on the server and on Pages |
| I3025 | DONE | 0 | — | Every Knowledge tile reads whole at a phone's width |
| I3079 | READY | 0 | — | The links of the Deployments table on /ui/delivery meet the target size at every audited width |
| I3271 | READY | 2 | I2741 | plan.drift reports a source it could not observe as unknown, never as a drift finding |
| I3319 | READY | 0 | — | No record names a repository a design was studied in |
The graph
flowchart LR
I2740["I2740<br/>An issue's delivery is inferred from branches, pull requests, merges, tags and the published site"]:::done
I2741["I2741<br/>Merged work the plan has not recorded is drift, and on the trunk past a window it is red"]:::done
I2742["I2742<br/>A milestone's version is inferred from the release that carried it, never typed"]:::done
I2743["I2743<br/>The public roadmap draws every milestone in the graph's order, each issue with its inferred delivery"]:::ready
I2744["I2744<br/>The UI roadmap reads delivery and the releases themselves, and its now is where work is"]:::ready
I2745["I2745<br/>The landing page states no present it does not read"]:::done
I2746["I2746<br/>Every published tree draws its diagrams, and every diagram is the interactive viewer"]:::done
I2747["I2747<br/>Every code block on every surface is highlighted by one engine with one palette"]:::ready
I2748["I2748<br/>The drift already on the trunk is settled before the gate is made blocking"]:::blocked
I2749["I2749<br/>A commit that only plans an issue is not its delivery"]:::ready
I2750["I2750<br/>The trunk's drift gate reads the forge before it judges"]:::ready
I2850["I2850<br/>the published PR Drain carries its pull requests, and counts pull requests rather than plan issues"]:::done
I2851["I2851<br/>the homepage's product view counts the delivery the history proves beside the statuses the records declare, each count a link"]:::ready
I2852["I2852<br/>every class a UI screen gives an element is one the UI's stylesheet defines"]:::done
I3020["I3020<br/>The Knowledge screen states nothing about the repository that its checkout could not observe"]:::done
I3021["I3021<br/>The Knowledge screen shows each review command as code with what it does as a sentence"]:::done
I3022["I3022<br/>An empty knowledge queue is one sentence that says how a record arrives, not two empty tables"]:::done
I3023["I3023<br/>The Knowledge screen reads in review order, in plain labels, and leads to the knowledge manual"]:::done
I3024["I3024<br/>The Knowledge screen's manual link names a page the site has, on the server and on Pages"]:::done
I3025["I3025<br/>Every Knowledge tile reads whole at a phone's width"]:::done
I3079["I3079<br/>The links of the Deployments table on /ui/delivery meet the target size at every audited width"]:::ready
I3271["I3271<br/>plan.drift reports a source it could not observe as unknown, never as a drift finding"]:::ready
I3319["I3319<br/>No record names a repository a design was studied in"]:::ready
I2740 --> I2741
I2740 --> I2743
I2740 --> I2744
I2740 --> I2851
I2741 --> I2748
I2741 --> I2749
I2741 --> I2750
I2741 --> I3271
I2742 --> I2743
I2749 --> I2748
I2750 --> I2748
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxLinked from this diagram (23)
- I2740 An issue's delivery is inferred from branches, pull requests, merges, tags and the published site
- I2741 Merged work the plan has not recorded is drift, and on the trunk past a window it is red
- I2742 A milestone's version is inferred from the release that carried it, never typed
- I2743 The public roadmap draws every milestone in the graph's order, each issue with its inferred delivery
- I2744 The UI roadmap reads delivery and the releases themselves, and its now is where work is
- I2745 The landing page states no present it does not read
- I2746 Every published tree draws its diagrams, and every diagram is the interactive viewer
- I2747 Every code block on every surface is highlighted by one engine with one palette
- I2748 The drift already on the trunk is settled before the gate is made blocking
- I2749 A commit that only plans an issue is not its delivery
- I2750 The trunk's drift gate reads the forge before it judges
- I2850 the published PR Drain carries its pull requests, and counts pull requests rather than plan issues
- I2851 the homepage's product view counts the delivery the history proves beside the statuses the records declare, each count a link
- I2852 every class a UI screen gives an element is one the UI's stylesheet defines
- I3020 The Knowledge screen states nothing about the repository that its checkout could not observe
- I3021 The Knowledge screen shows each review command as code with what it does as a sentence
- I3022 An empty knowledge queue is one sentence that says how a record arrives, not two empty tables
- I3023 The Knowledge screen reads in review order, in plain labels, and leads to the knowledge manual
- I3024 The Knowledge screen's manual link names a page the site has, on the server and on Pages
- I3025 Every Knowledge tile reads whole at a phone's width
- I3079 The links of the Deployments table on /ui/delivery meet the target size at every audited width
- I3271 plan.drift reports a source it could not observe as unknown, never as a drift finding
- I3319 No record names a repository a design was studied in
Canonical record: .ai/repo/project/milestones/truthful-plan-surfaces.yaml. Read it back with majordomus plan show truthful-plan-surfaces.