{
  "schema": "DAT004_LAB_MODEL_CONTRACT_v1",
  "lab_id": "DAT004-LAB1",
  "postgresql_major": 18,
  "disposable_schema_only": true,
  "dimensions": [
    "lock_wait",
    "deadlock_cycle",
    "lock_ordering",
    "locking_clause_boundary",
    "optimistic_compare_swap"
  ],
  "expected_bounded_observables": {
    "deadlock_sqlstate": "40P01",
    "nowait_sqlstate": "55P03",
    "optimistic_stale_affected_rows": 0
  },
  "runtime_evidence_must_be_real": true,
  "skip_locked_boundary": "locked rows may be omitted; not a complete view",
  "runtime_gate_contract": {
    "blocking": "both sessions succeed and contender wait is observed (>=1.0 s in supplied runner)",
    "deadlock": "exactly one initial victim and SQLSTATE 40P01",
    "ordered": "both sessions succeed with no 40P01 for the targeted opposite-order cycle",
    "nowait": "holder succeeds, contender fails with SQLSTATE 55P03",
    "skip_locked": "with job 1 held, consumer returns job 2 and not job 1",
    "optimistic": "current version returns reservation_id=1/version=8, stale returns zero rows, final state remains current-write/version=8",
    "cleanup": "generated schema cleanup must pass before runtime evidence is claimable"
  },
  "runtime_provenance_required": [
    "generated_schema",
    "postgresql_version_num",
    "input_sha256",
    "model_contract_sha256",
    "cleanup_status",
    "all_runtime_gates_pass"
  ]
}
