* feat(teaching): add curriculum-sourced proposal builder * test(teaching): cover curriculum proposal construction * test(evals): add curriculum loop closure contract * test(evals): add curriculum loop closure runner * test(evals): add canonical curriculum loop closure report * ci(lanes): pin curriculum loop closure lane * docs(adr): add ADR-0104 curriculum sourced proposals * docs(adr): register ADR-0104 and seven pinned lanes * docs(teaching): mark curriculum source activation * fix(ci): pin curriculum_loop_closure SHA to runner output * fix(ci): register curriculum_loop_closure in CLAIMS.md generator
2.1 KiB
2.1 KiB
evals/curriculum_loop_closure — Lane Contract
ADR: ADR-0104 Invariants:
curriculum_proposal_replay_equivalencecurriculum_proposal_single_review_path
Purpose
Prove that curriculum-authored teaching items can emit
:class:PackMutationProposal candidates that traverse the existing
reviewed teaching path without violating ADR-0104 hard constraints.
The lane asserts:
- A legitimate
PACK_MUTATION_CANDIDATEcurriculum finding produces a curriculum-sourced proposal withsource.kind="curriculum"andepistemic_status=SPECULATIVE. - Identity-override curriculum items are rejected at construction, before review, so the proposal never reaches the proposal log.
- A finding whose replay-equivalence check fails is rejected at
construction; its
finding_idappears in the batch'srejectionslist with reasonreplay_equivalence_failed. - A non-
PACK_MUTATION_CANDIDATEfinding raises :class:CurriculumProposalError; curriculum import cannot promote diagnostic findings into pack mutations. - Same finding stream + same curriculum_id + same revision -> byte-identical proposal id stream across two runs.
Cases
- positive_basic — single coherent
PACK_MUTATION_CANDIDATEfinding -> proposal emitted with curriculum source. - identity_override_subject — finding subject contains an identity-override pattern -> rejected at construction.
- identity_override_action — finding
proposed_actioncontains an identity-override pattern -> rejected at construction. - replay_equivalence_failed — finding sent through a checker that reports trace-hash divergence -> rejected at construction.
- wrong_finding_kind — non-
PACK_MUTATION_CANDIDATEfinding -> raisesCurriculumProposalError. - determinism — three findings emitted twice; proposal-id streams must be identical between the runs.
Determinism
The runner emits results/v1_dev.json with case results and a
SHA-256 of the canonical report bytes. Two consecutive runs against
the same fixtures must produce identical bytes.
Exit code
Non-zero on any divergence between expected and actual outcomes.