I2742 — A milestone's version is inferred from the release that carried it, never typed
Remove version from the milestone schema and the eight records that carry it, refuse a record that carries one, and derive released_in for a milestone as the first release record (the tracked statement of a tag) whose commit contains the merge of its last accepted issue (unreleased while open), in both the awk and the Rust engines' output; rewrite the vendored roadmap-integrity rule and its validator to match.
DONE wave 0 · p0 · implementation profile · parallel safe
Objective
Remove version from the milestone schema and the eight records that carry it, refuse a record that carries one, and derive released_in for a milestone as the first release record (the tracked statement of a tag) whose commit contains the merge of its last accepted issue (unreleased while open), in both the awk and the Rust engines' output; rewrite the vendored roadmap-integrity rule and its validator to match.
Why
ADR 0166 decision 3. version is typed by hand: 0.1 to 1.0 on eight milestones written before releases existed, two of them 0.5, out of rank order, beside a product at v0.27.0.
Current state
lib/project.awk:359 and plan.rs:289 emit the raw field; site/templates/roadmap.html filters on it; lib/doctor.sh mj_validate_roadmap checks a README table against it.
Desired state
No version field anywhere in .ai/repo/project/milestones; plan.roadmap and roadmap.json carry released_in with its release record; the README roadmap table and its validator use released_in.
Scope
- .ai/repo/project/milestones
- share/schemas
- share/allow
- lib/project.awk
- lib/project.sh
- lib/plan.sh
- lib/doctor.sh
- apps/majordomus-cli/src/plan.rs
- .ai/repo/rules/vendor/majordomus/rules/roadmap-integrity.v1.md
- share/standard/majordomus/rules/roadmap-integrity.v1.md
- README.md
- docs/PLANNING.md
- site/data/generated
- docs/generated
- test/cases/49_roadmap_integrity.sh
- test/cases/3102_a_milestone_version_is_inferred.sh
Dependencies
None. This issue is a root of the graph.
What waits on this
Acceptance criteria
- plan validate refuses a milestone record carrying version
- A milestone whose last issue's merge is contained in v0.27.0 reads released_in v0.27.0; an open one reads unreleased
- The awk and Rust engines agree (case 99)
Validation
- bin/majordomus plan validate
- bash test/run.sh 49_roadmap_integrity 99_engines_agree 3102_a_milestone_version_is_inferred
Evidence required
- version_inferred_case
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| version_inferred_case | test | bash test/run.sh 3102_a_milestone_version_is_inferred 99_plan_capabilities 49_roadmap_doctrine 48_roadmap_graph 47_mutation | ok 3102, 99, 49, 48, 47 at f8fe9133238: a typed version is refused; released_in v0.26.0 -> unreleased on reopen -> v0.27.0 (rc tag ignored, later tag does not move it); open milestone unreleased; shell and executable agree (this repo M000/M001 v0.2.0) | f8fe913 |
| version_inferred_case | test | bash test/run.sh 3102_a_milestone_version_is_inferred 49_roadmap_doctrine 99_plan_capabilities 48_roadmap_graph 47_mutation | ok 3102, 49, 99, 48, 47 with released_in read from release records: a typed version is refused; v0.26.0 record -> unreleased on reopen -> v0.27.0 record (rc record and a bare tag ignored, a later record does not move it); open milestone unreleased; shell and executable agree (this repo M000/M001 v0.3.1, the earliest record) | 8642d74 |
| version_inferred_case | ci | validate run 39438896504 at master 9a5a9b77520: suite-shard (1) job 118683336189 runs 3102_a_milestone_version_is_inferred; suite-shard (3) job 118683336157 runs 49_roadmap_doctrine and 99_plan_capabilities | success (the run's only red job is pages, which runs no test) | 573df96 |
Timeline
- started
- 2026-10-16T09:09:12Z
- verified
- 2026-10-16T10:37:25Z
- completed
- 2026-10-20T22:12:41Z
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/I2742.yaml. Read it back with majordomus plan show I2742.