I3972 — plan validate names every issue held only by its milestone gate, and an issue may declare it needs nothing from the milestone's dependencies
The milestone gate (plan.rs:1110-1130) holds every issue of a milestone whose depends_on is not DONE, whatever the issue itself needs. Make it explainable and narrowable: plan validate emits a warning held_only_by_milestone naming every BLOCKED issue whose own depends_on are all DONE and whose blocked_by holds only milestone:<id> entries, with the milestone that holds it; and an issue may declare milestone_gate: own (schema issue.v1, default all), which keeps it out of the gate so it is held only by its own depends_on. The opt-out reaches every consequence of the gate in both engines: the issue-level premature_execution check (plan.rs:1118-1135, project.awk:311) skips an opted-out issue, and the milestone-level milestone_premature check (plan.rs:1080-1086, project.awk:287) does not fail a blocked milestone whose only ACTIVE, VERIFY or DONE issues are opted out; such a milestone keeps the derived status BLOCKED, with the opted-out work reported beside it. Both engines, plan.rs and lib/project.awk, derive the same, held equal by case 99_plan_capabilities. A milestone keeps ordering the roadmap exactly as now. I3757 rewrites the same gate code to name what holds a milestone and lands first.
BLOKOVÁNO vlna 1 · p1 · profil implementation · běží samostatně
Blocked. This issue cannot start until I3757 is done. The status is derived from that, not declared.
Cíl
The milestone gate (plan.rs:1110-1130) holds every issue of a milestone whose depends_on is not DONE, whatever the issue itself needs. Make it explainable and narrowable: plan validate emits a warning held_only_by_milestone naming every BLOCKED issue whose own depends_on are all DONE and whose blocked_by holds only milestone:<id> entries, with the milestone that holds it; and an issue may declare milestone_gate: own (schema issue.v1, default all), which keeps it out of the gate so it is held only by its own depends_on. The opt-out reaches every consequence of the gate in both engines: the issue-level premature_execution check (plan.rs:1118-1135, project.awk:311) skips an opted-out issue, and the milestone-level milestone_premature check (plan.rs:1080-1086, project.awk:287) does not fail a blocked milestone whose only ACTIVE, VERIFY or DONE issues are opted out; such a milestone keeps the derived status BLOCKED, with the opted-out work reported beside it. Both engines, plan.rs and lib/project.awk, derive the same, held equal by case 99_plan_capabilities. A milestone keeps ordering the roadmap exactly as now. I3757 rewrites the same gate code to name what holds a milestone and lands first.
Proč
The study for this intent counted the issues waiting only on their milestone; measured at 355a0cee79a with plan list --json, 26 BLOCKED issues have every dependency of their own DONE and are held only by milestone:<id>. A worker reading plan blocked sees milestone:x and cannot tell whether the work needs that outcome or merely sits under it, so independent work waits.
Aktuální stav
Verified at 355a0cee79a: plan.rs:1061-1091 computes mblocked per milestone in rank order and plan.rs:1110-1130 applies it to every issue of the milestone; devtask/readiness.rs names that case TaskReadiness::Waiting; no finding counts it; issue.v1 has no field to opt out.
Cílový stav
plan validate lists the 26 (or however many there are then) with their milestones; an issue declaring milestone_gate: own is READY when its own dependencies are DONE; both engines agree.
Rozsah
- apps/majordomus-cli/src/plan.rs
- lib/project.awk
- share/schemas/majordomus/issue/issue.v1.schema.json
- apps/majordomus-cli/src/devtask/readiness.rs
- test/cases/99_plan_capabilities.sh
- .ai/repo/project/issues/I3972.yaml
Mimo rozsah
- Changing any milestone's depends_on or any existing issue's gate
Závislosti
Kritéria přijetí
- A fixture plan with one issue held only by its milestone gets a held_only_by_milestone warning naming it and the milestone (case an_issue_held_only_by_its_milestone_is_named)
- The same issue declaring milestone_gate: own derives READY; one with an unfinished dependency of its own stays BLOCKED
- An opted-out issue that is ACTIVE or DONE under a blocked milestone raises neither premature_execution nor milestone_premature in either engine, and the milestone stays BLOCKED
- plan.rs and lib/project.awk derive identical statuses on the fixture and on the repository
Validace
- bin/majordomus plan validate
- env -u MAJORDOMUS_SHARE cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib -- plan::
- env -u MAJORDOMUS_SHARE bash test/run.sh 99_plan_capabilities
Požadované důkazy
- milestone_gate_is_explained
Důkazy
Nic nezaznamenáno. Za každým tokenem výše musí stát příkaz nebo artefakt, než lze tento úkol dokončit; vyprávění se odmítá.
Časová osa
- zahájeno
- —
- ověřeno
- —
- dokončeno
- —
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Canonical record: .ai/repo/project/issues/I3972.yaml. Read it back with majordomus plan show I3972.