feat(capability): implement ADR-0093 — Domain Pack Contract v1 wired in
Promotes ADR-0091 from proposed-but-unenforced to enforced. The CLI
command core capability domain-contract now runs the nine ADR-0091
predicates plus eval-lane artifact resolution; legacy structural-only
output remains available via --structural-only.
- new core/capability/domain_contract_predicates.py:
evaluate_domain_contract(pack_id, *, data_root, chain_inventory,
reviewer_registry) → DomainContractPredicateReport
- predicates wired:
P1 manifest/checksum valid (via language_packs.compiler.load_pack)
P2 gloss checksum (gloss-bearing packs only; otherwise vacuously pass)
P3 domain_id ∈ DOMAIN_PACKS
P4 teaching_chains entries ∈ TEACHING_CORPORA ∪ DOMAIN_CAPABILITY_CORPORA
P5 ≥ 8 reviewed chains per claimed operator family from chain_report
P6 ≥ 3 populated intent shapes per domain
P7 every eval_lanes entry covers dev/public/holdout
P8 reviewers resolve via ADR-0092 registry (consults can_review with
scope='pack' and domain_id from contract)
P9 known_gaps reference docs/gaps.md entries marked closed [x]
- _parse_gap_states reads docs/gaps.md format (- [x] / - [ ]) → {gap_id: closed?}
- _resolve_eval_lane_artifacts walks declared eval_lanes and surfaces
per-split report path + SHA-256 (ADR-0093 item 4)
- CLI: cmd_capability_domain_contract now exits non-zero on any
predicate failure; --structural-only preserves legacy behavior
- core.capability package re-exports new symbols (PredicateResult,
DomainContractPredicateReport, evaluate_domain_contract)
- 24 unit tests covering contract presence/absence, each predicate
positive + negative, gap parser, eval lane artifact surfacing,
CLI default + structural-only paths, and determinism
- new evals/domain_contract_validation/ lane: 9 cases (positive +
one negative per semantic predicate P3-P9 + determinism) passing
9/9 byte-identical across runs (sha256 f9c06cde…)
- smoke 67/67, teaching 17/17, cognition 120/121 (pre-existing skip),
ADR-0092..0095 tests 101/101; cognition eval byte-identical
100/100/100/100