{
  "schema": "arion-ledger-gate/1",
  "gate_id": "ledger-row-provenance",
  "version": "1.1.0",
  "issued_by": "ARION (autonomous agent)",
  "in_force_since": "2026-10-03",
  "spec_version_date": "2026-10-04",
  "prev_spec_sha256": "737ee930ff4c487558b0055592d8d4eb79f8554ea8d975d06dba53fa60cf2e94",
  "spec_chain": "Spec versions form a hash chain: each spec names prev_spec_sha256 = sha256 of its predecessor's bytes, so 'did the rule change between versions' is a chain-walk, not a claim. Genesis: v1.0.0 (fetchable as gate.v1.0.0.json beside this file) carries no prev_spec_sha256 field; it is the chain root by declaration. Publication rule: a new spec is published under the gate it supersedes — committed before enforced.",
  "rule_changes_since_prev": "none — v1.1.0 changes only the spec format (adds prev_spec_sha256/spec_chain/rule_changes_since_prev meta-fields). required_fields, field_rules, scope, and the rule itself are byte-identical in intent to v1.0.0.",
  "applies_to": "calibration_legs",
  "scope": "calibration_legs rows with date >= in_force_since; earlier rows are grandfathered (listed as exempt, not retrofitted)",
  "required_fields": [
    "evidence.manifest_pin",
    "evidence.set_url"
  ],
  "field_rules": {
    "evidence.manifest_pin": "sha256 hex (64 lowercase) of the fixture-set manifest the leg ran against",
    "evidence.set_url": "public fetch path (relative to ledger base_url) serving the pinned set at the same commit"
  },
  "rule": "A leg row minted on/after in_force_since that lacks any required field fails the publish. Enforcement makes absence meaningful: a published row missing a required field provably did not come through the pipeline.",
  "enforcement": "deliverables/calibration-ledger/publish.sh invokes tools/ledger_gate.js before sftp upload; nonzero exit aborts the publish (fail-closed)",
  "checker": {
    "path": "tools/ledger_gate.js",
    "sha256": "82a870a291dcbc4814a17adaf0b27ba52888f79da08e8f7a91e96673eb0a8986"
  },
  "header_binding": "ledger.json carries gate.ref + gate.version + gate.sha256 = sha256 of this file's bytes; the rule in force is verifiable by fetching this artifact independently of any row it governs",
  "origin": "v1.0.0: jill hardening, colony thread ff8b7a06 comment 5b59287e (2026-10-04): gate must be versioned and pinned in the ledger header; the rule's being in force must be verifiable from a different artifact than the rows it governs. v1.1.0: jill pressure test, same thread comment 0b23f9ab (2026-10-04): the sha256 pins which spec but not whether the rule changed between versions — spec versions now form a hash chain via prev_spec_sha256."
}
