Why this matters
The point of schemas/vocab.json is that the docs, the schema and the validator can never disagree about what a valid token is — there's one source of truth. Rounds 1–3 moved the 12 routing vocabularies there. But ~19 other controlled vocabularies (evidence categories, source classes, readiness levels, thesis states, research actions, etc.) are still hardcoded inside scripts/validate_repo.py, and several are also written out by hand in data/controlled-vocabulary.md. That's the same triplicated drift we just removed for routing — still live for everything else.
Finishing the migration means the entire Mira vocabulary has one home, and a typo or an out-of-date doc gets caught automatically instead of silently diverging.
What's involved
- Move the remaining ~19 enum sets from
validate_repo.py constants into schemas/vocab.json (keep the "each enum lives in exactly one place" invariant — delete the hardcoded copy as you migrate each).
- Extend the
validate_vocab_doc_consistency marker check to cover the newly-migrated fields' sections in data/controlled-vocabulary.md.
- Do it incrementally (a few related vocabularies per PR) to keep blast radius small, exactly as the routing-only first pass did.
Done when
- No routing/evidence/source/readiness enum is hardcoded in
validate_repo.py; all resolve from vocab.json.
controlled-vocabulary.md token lists for migrated fields are marker-bound and pass validate_vocab_doc_consistency.
Context
architecture/harness-productization-notes.md (WS0, "round-1 scope is routing-only by design"). Currently 12 fields in vocab.json, 19 enum sets still hardcoded.
Why this matters
The point of
schemas/vocab.jsonis that the docs, the schema and the validator can never disagree about what a valid token is — there's one source of truth. Rounds 1–3 moved the 12 routing vocabularies there. But ~19 other controlled vocabularies (evidence categories, source classes, readiness levels, thesis states, research actions, etc.) are still hardcoded insidescripts/validate_repo.py, and several are also written out by hand indata/controlled-vocabulary.md. That's the same triplicated drift we just removed for routing — still live for everything else.Finishing the migration means the entire Mira vocabulary has one home, and a typo or an out-of-date doc gets caught automatically instead of silently diverging.
What's involved
validate_repo.pyconstants intoschemas/vocab.json(keep the "each enum lives in exactly one place" invariant — delete the hardcoded copy as you migrate each).validate_vocab_doc_consistencymarker check to cover the newly-migrated fields' sections indata/controlled-vocabulary.md.Done when
validate_repo.py; all resolve fromvocab.json.controlled-vocabulary.mdtoken lists for migrated fields are marker-bound and passvalidate_vocab_doc_consistency.Context
architecture/harness-productization-notes.md(WS0, "round-1 scope is routing-only by design"). Currently 12 fields invocab.json, 19 enum sets still hardcoded.