Skip to content

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

Part of truthful-plan-surfaces — The plan's surfaces are inferred from delivery, and nothing they show is typed beside the repository.

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

coverstypecommandresultat commit
version_inferred_casetestbash test/run.sh 3102_a_milestone_version_is_inferred 99_plan_capabilities 49_roadmap_doctrine 48_roadmap_graph 47_mutationok 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_casetestbash test/run.sh 3102_a_milestone_version_is_inferred 49_roadmap_doctrine 99_plan_capabilities 48_roadmap_graph 47_mutationok 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_casecivalidate 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_capabilitiessuccess (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.

Searches the titles and descriptions of every page this site publishes.