I3440 — A milestone's meter counts the issues it requires, and a milestone with none says so
Every UI meter of a milestone's issues draws DONE out of counts.required (total less cancelled), the denominator the milestone's own status derivation and the published /roadmap/ already use, and a milestone that holds no issue reads 'no issues' instead of '0 of 0'.
READY wave 0 · p1 · implementation profile · parallel safe
Ready. Every dependency is done, so majordomus plan start I3440 will be accepted.
Objective
Every UI meter of a milestone's issues draws DONE out of counts.required (total less cancelled), the denominator the milestone's own status derivation and the published /roadmap/ already use, and a milestone that holds no issue reads 'no issues' instead of '0 of 0'.
Why
On 2026-10-19 the owner asked that /roadmap be correct and connected. Review finding P6: the milestone meter counts CANCELLED issues in its denominator (fly-deployment shown as 4 of 35 when only 26 were required at the review's reading), and foundation shows '0 of 0'. The work starts only after the exclusive mesh claim another session holds on apps/majordomus-cli/src/plan/flight.rs, apps/majordomus-cli/src/ui/roadmap.rs and apps/majordomus-cli/tests/ui_roadmap.rs is released or handed over: this record does not edit those files, but /ui/roadmap draws its rows through the code it changes.
Current state
milestone_row (apps/majordomus-cli/src/ui/dashboard.rs:173-190), which both the Overview and /ui/roadmap (apps/majordomus-cli/src/ui/roadmap.rs:96-103) draw, meters /counts/by_status/DONE out of /counts/total (dashboard.rs:174-175); so do the milestone inspector (apps/majordomus-cli/src/ui/milestone.rs:309-314) and the observatory's milestone nodes (apps/majordomus-cli/src/ui/observatory.rs:635-636, 883). PlanCounts.required exists for exactly this (apps/majordomus-cli/src/plan.rs:349-357, computed as total less cancelled at plan.rs:1495-1498) and is read by nothing in the UI. plan.roadmap at master 9904000d2df on 2026-10-19 gives fly-deployment total 32, required 23, DONE 4, CANCELLED 9, so the row reads 4 of 32; foundation is DONE with total 0, and meter (apps/majordomus-cli/src/ui/view.rs:479-505) prints '0 of 0' for a zero total, pinned by the test at view.rs:809-815. The published /roadmap/ already reads 'DONE of required' and draws no meter for a zero total (site/templates/roadmap.html:66-70), so the two surfaces disagree.
Desired state
Every milestone meter on /ui (Overview, Roadmap, milestone inspector, observatory) is DONE out of counts.required; a milestone with no issue reads 'no issues' and draws no bar; a milestone whose issues are all cancelled reads 'no issue required'. A crate test pins each case; the meter of an issue's evidence (apps/majordomus-cli/src/ui/issues.rs:337-340) keeps its own numbers.
Scope
- apps/majordomus-cli/src/ui/dashboard.rs
- apps/majordomus-cli/src/ui/milestone.rs
- apps/majordomus-cli/src/ui/observatory.rs
- apps/majordomus-cli/src/ui/view.rs
- apps/majordomus-cli/tests/dashboard.rs
Out of scope
- The published /roadmap/ page, which already reads required.
- How PlanCounts is computed, or whether a CANCELLED issue belongs to its milestone.
- The evidence meter of an issue.
Dependencies
None. This issue is a root of the graph.
What waits on this
- I3768BLOCKED Every plan surface answers 'when' from the records: a release's date beside its version, and the last delivery date of each open milestone
- I3773BLOCKED Every plan surface draws a milestone's progress as a bar of the issues it requires, a blocked milestone's bar says the gate is closed, and the roadmap no longer says a bar would be a lie
Acceptance criteria
- A milestone of 32 issues, 9 of them cancelled and 4 done, reads '4 of 23' on the Overview, /ui/roadmap and its inspector, and never '4 of 32'
- A milestone with no issue reads 'no issues' with no meter bar and never '0 of 0'
- A milestone whose every issue is cancelled reads that no issue is required, and its bar is not drawn as empty work
- A milestone with no cancelled issue reads DONE out of its total, as before
Validation
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib ui::view
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib ui::dashboard
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib ui::milestone
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test dashboard
- scripts/ui audit --only /ui/roadmap
Evidence required
- milestone_meter_counts_required
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3440.yaml. Read it back with majordomus plan show I3440.