For each invariant, where it is enforced. All 28 invariants are
ENFORCED (code exists and tests fail if violated). INV-15 was
upgraded from FUTURE to MOCK — the artifact now carries a version
field and schema/artifact.schema.json defines the format.
INV Enforcement point Status
INV-01: Append, not modify elench-store::store_blob/tree/claim — idempotent, no update (MemoryStore + FjallStore)ENFORCED
INV-02: Prior status visible elench-claim::compute_status — fold reads all recordsENFORCED
INV-03: Claim identity stable elench-claim::ClaimId — content address, immutableENFORCED
INV-04: Status computed, not stored elench-claim::compute_status — pure functionENFORCED
INV-28: Claim OID is content hash elench-claim::ClaimId::from_content — SHA-256 of canonical JSONENFORCED
INV-29: dependsOn acyclic elench-claim::validate_claim — DFS cycle detection over logENFORCED
INV Enforcement point Status
INV-05: origin.kind required elench-claim — type system, OriginKind non-optionalENFORCED
INV-06: No harness-observed from agents elench-claim::validate_claim — cross-checks signer.entity against origin.kindENFORCED
INV-07: Only harness emits verification elench-claim::validate_claim — cross-checks signer.entity against kindENFORCED
INV-08: Predicate requires expression elench-claim::validate_claim — calls elench-predicate::parseENFORCED
INV-09: Annotations never read by policy elench-gate::evaluate — filters on form=predicate, skips annotationsENFORCED
INV-11: Failure recorded only when status changed elench-claim::validate_claim — checks target status in logENFORCED
INV-12: No residue-acceptance from agents elench-claim::validate_claim — cross-checks signer.entity against kindENFORCED
INV Enforcement point Status
INV-13: Gate without build elench-gate::evaluate — takes &[Claim], no build callsENFORCED
INV-14: Artifact acceptability is live evaluation elench-gate::evaluate — called on demand, no cached verdictENFORCED
INV-15: Artifact carries (tree, policy), not verdict elench-gate::Artifact — version, tree, policy, digest, released_at; schema/artifact.schema.json; no verdict fieldENFORCED (MOCK)
INV Enforcement point Status
INV-16: unevaluated first-class elench-claim::ClaimStatus::UnevaluatedENFORCED
INV-17: Bounded residue with acceptance elench-gate::evaluate — condition 2, residue-acceptance recordsENFORCED
INV Enforcement point Status
INV-18: elench owns content-addressed store elench-store — no git dependency, owns storage; MemoryStore (default) + FjallStore (optional, ADR-0008)ENFORCED
INV-19: Git projection is read-only elench-projection::synthesize — takes &dyn StoreBackend, no writes; elench-projection::materialize — writes to filesystem, not to storeENFORCED
INV-20: Git synthesis deterministic elench-projection — proptest_inv_20_synthesis_deterministic + proptest_inv_20_synthesis_order_independentENFORCED
INV-21: Git projection no side effects elench-projection — scenario_inv19_projection_does_not_write_to_storeENFORCED
INV-25: Content addressing (SHA-256) elench-store::Oid::from_blob_data/from_tree_entries + deserialize_tree_bytes round-trip; elench-claim::ClaimId::from_content; FjallStore::read_tree round-trip (feature tier)ENFORCED
INV-26: Store is sole source of truth elench-store — all views derive from store; `–store memoryfjall ` selects backend at runtime
INV-27: Git projection is lossy, not authoritative elench-projection — scenario_inv27_projection_is_lossyENFORCED
INV Enforcement point Status
INV-22: DSSE/in-toto shared format elench-envelope::sign / verify; PREDICATE_TYPE_AGENT; Ed25519 signatures (A1)ENFORCED
INV Enforcement point Status
INV-23: Expressions executable/deterministic/sandboxable elench-predicate — 4 primitives (grep, test, run, exists), not Turing-completeENFORCED
INV Enforcement point Status
INV-24: AGENTS.md rules enforced elench-claim::validate_claim — implemented, all rules enforcedENFORCED
Function Enforcement point Status
elench_claim::detect_conflictsSame-anchor, different expression — crates/elench-claim/src/lib.rs; 8 unit tests + 4 CLI tests ENFORCED