Situation
The plan lives in a tracker nobody reads from the repository, or in a document whose status column is a matter of opinion. What is ready to start and what is blocked is an argument, not a query.
Scenario
setup: plan-model
given:
- 'a canonical project model with one milestone and two issues, the second depending on the first'
steps:
- id: validate
run: ['plan', 'validate']
note: 'every record parses, every reference resolves, the dependency graph is acyclic'
expect:
exit: 0
stdout_contains: ['milestone', 'issue', '0 failure']
- id: what-is-ready
run: ['plan', 'ready']
note: 'the issues nothing blocks'
expect:
exit: 0
stdout_contains: ['I0001']
- id: what-is-blocked
run: ['plan', 'blocked']
note: 'the issues waiting on another'
expect:
exit: 0
stdout_contains: ['I0002']
then:
- 'status is derived from the records and git, never written into them'
- 'an issue cannot be marked done without the evidence its milestone requires'Outcome
Milestones and issues are files under .ai/repo/project/; plan validate refuses a dangling dependency or a cycle, and plan ready and plan blocked are computed from the same records every time.