{
  "schema": "DAT005_LAB_MODEL_CONTRACT_v1",
  "critical_dimensions": [
    "migration_contract",
    "alter_lock_scope",
    "data_transition",
    "compatibility_window",
    "recovery_decision",
    "migration_evidence"
  ],
  "required_observations": [
    "baseline old contract",
    "early NOT NULL failure",
    "backfill unresolved/invalid/target-null counts",
    "explicit target-null resolution decision for the synthetic fixture",
    "old/new reader-writer overlap result",
    "ALTER lock probe result",
    "old-reader removal negative probe",
    "recovery decision"
  ],
  "runtime_evidence_must_be_real": true,
  "runtime_gate_contract": {
    "early_not_null": "real failure must be SQLSTATE 23502",
    "backfill_readiness": "verify counts must show one target-null fixture before explicit resolution and zero afterward",
    "overlap": "old and dual-writer behavior must be observed",
    "enforcement": "NOT NULL must be observable in catalog and late old writer must fail with 23502",
    "removal": "transaction-scoped drop must demonstrate old reader failure with 42703",
    "alter_lock": "bounded lock probe must produce 55P03 under the supplied fixture",
    "cleanup": "generated schema cleanup must pass before evidence is claimable"
  },
  "runtime_provenance_required": [
    "generated_schema",
    "postgresql_version_num",
    "input_sha256",
    "model_contract_sha256",
    "cleanup_status",
    "runner_gate_summary"
  ]
}
