{
  "schema": "MKN031_VISIBLE_RULES_v1",
  "rules": [
    {
      "id": "R1",
      "text": "Candidate generated_from_revision_id and base_digest must equal current canonical revision/digest; otherwise STALE_BASE and HOLD."
    },
    {
      "id": "R2",
      "text": "Target and protected canonical node sets must be disjoint; changed canonical nodes must be a subset of target_node_ids."
    },
    {
      "id": "R3",
      "text": "Protected digest map must equal current canonical protected-node digests."
    },
    {
      "id": "R4",
      "text": "Candidate patch must test both canonical revision_id and digest before any mutating operation."
    },
    {
      "id": "R5",
      "text": "Computed dependency closure from targets must equal the declared affected_derived_artifacts for this fixture."
    },
    {
      "id": "R6",
      "text": "A stable node ID may not change node_type or semantic_key without an explicit identity migration; none is authorized here."
    },
    {
      "id": "R7",
      "text": "Missing source/evidence snapshot or provenance binding produces UNKNOWN/HOLD rather than success."
    },
    {
      "id": "R8",
      "text": "Consequential claim/assessment change requires review before promotion."
    }
  ]
}
