I0003 — Implement the model loader and the status derivation engine
Load every canonical file into one normalised model and derive issue and milestone status from recorded facts, in exactly one implementation that every surface calls.
DONE wave 2 · p0 · deep-work profile · runs alone
Part of M000 — Milestone and DAG driven development.
Objective
Load every canonical file into one normalised model and derive issue and milestone status from recorded facts, in exactly one implementation that every surface calls.
Why
Four surfaces need to know what is READY. Four implementations of READY is four answers. One engine is the whole architecture.
Current state
Nothing read the canonical files.
Desired state
lib/project.sh loads the files, lib/project.awk derives the model, and the CLI, the site generator and the GitHub adapter all read that model.
Scope
- lib/project.sh
- lib/project.awk
Out of scope
- Any status field a human can set directly
Dependencies
What waits on this
Acceptance criteria
- Issue status is derived from started_at, verified_at, completed_at, cancelled, evidence coverage and dependency state
- Milestone status is derived from its issues and its own evidence
- The active milestone is derived from order and status, not declared
- A completed issue whose required evidence is missing derives VERIFY, not DONE
Validation
- bash test/run.sh 41_project_status
Evidence required
- status_test
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| status_test | test | bash test/run.sh 41_project_status | 1 passed, 0 failed | 2dd5915 |
Risk
bash 3.2 has no associative arrays; the graph work is done in awk, which does.
Timeline
- started
- 2026-09-04T03:12:45Z
- verified
- 2026-09-04T03:12:46Z
- completed
- 2026-09-04T03:12:47Z
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/I0003.yaml. Read it back with majordomus plan show I0003.