{
  "schema": "MAKNOW_D3D002_LAB_CHECK_RULES_v1.1",
  "lesson_id": "D3D-002",
  "lab_id": "D3D-002-LAB1",
  "purpose": "Visible consistency and evidence rules only. This file is not an answer key and does not choose a learner decision.",
  "allowed_final_states": [
    "ACCEPT",
    "TARGET_SPECIFIC",
    "REWORK_REQUIRED",
    "HOLD",
    "EVIDENCE_INCOMPLETE",
    "PROVENANCE_UNKNOWN",
    "METHOD_UNSUITABLE"
  ],
  "positive_states": [
    "ACCEPT",
    "TARGET_SPECIFIC"
  ],
  "rules": [
    {
      "id": "R1",
      "text": "All declared critical evidence fields required by the selected target must be present before a positive state."
    },
    {
      "id": "R2",
      "text": "If uv_overlap_policy is UNIQUE_REQUIRED, MIRRORED or ACCIDENTAL_OVERLAP evidence is incompatible with a positive state unless target policy is explicitly changed and revalidated."
    },
    {
      "id": "R3",
      "text": "For the declared glTF 2.0 metallic-roughness target, Base Color RGB is SRGB; metallic and roughness data are LINEAR; normal and occlusion data are treated as non-color/LINEAR evidence in this lab contract."
    },
    {
      "id": "R4",
      "text": "Channel packing is target-specific. PACKED_ORM requires an explicit target convention and explicit R=Occlusion, G=Roughness, B=Metallic bindings in this lab; this is a declared runtime contract, not a universal glTF claim."
    },
    {
      "id": "R5",
      "text": "A positive state requires a declared normal convention and UV-set binding for every used texture role."
    },
    {
      "id": "R6",
      "text": "A positive state requires source/provenance, rights status and manual-edit history. Unknown provenance cannot be inferred by the checker."
    },
    {
      "id": "R7",
      "text": "Lighting validation for a positive state requires at least two distinct declared lighting conditions with visible observations that a reviewer can inspect."
    },
    {
      "id": "R8",
      "text": "A positive state requires explicit target binding checks with visible expected/observed records; successful export or a beauty render cannot by itself satisfy interoperability or material-quality evidence."
    },
    {
      "id": "R9",
      "text": "ACCEPT requires target_constraint_scope=STANDARD_DECLARED_TARGET; TARGET_SPECIFIC requires CONSTRAINED_NAMED_TARGET_ONLY."
    },
    {
      "id": "R10",
      "text": "Every decision must include at least one applicable learner-authored future trigger condition named as review, migration, escalation, stop, or pivot. Do not require all five categories mechanically."
    },
    {
      "id": "R11",
      "text": "Non-success states remain valid when decisive evidence is missing or disputed; the checker reports consistency problems but does not replace the learner's state with an answer."
    }
  ],
  "human_accountability": "A human reviewer must reconstruct the bounded decision from visible evidence; checker consistency is not approval.",
  "rule_source_contract": "pack_rules.py consumes allowed states, positive states, and rule IDs from this visible file; no hidden rule source is authoritative."
}
