{
  "schema": "MAKNOW_AWR005_VISIBLE_CHECK_RULES_v1.0",
  "lesson_id": "AWR-005",
  "lab_id": "AWR-005-LAB1",
  "checker_has_hidden_answer_key": false,
  "state_vocabulary": [
    "USE",
    "PILOT",
    "NOT_NOW",
    "UNKNOWN",
    "EVIDENCE_INCOMPLETE",
    "OWNER_MISSING",
    "REVIEW_REQUIRED",
    "HOLD",
    "PARTIAL",
    "DISPUTED"
  ],
  "positive_states": [
    "USE",
    "PILOT"
  ],
  "rules": [
    {
      "id": "R1",
      "text": "Submission contains exactly NATIVE_MOBILE, CUSTOM_BILLING, and SAAS_MULTI_TENANCY records."
    },
    {
      "id": "R2",
      "text": "Each decision_state belongs to the visible state vocabulary."
    },
    {
      "id": "R3",
      "text": "Evidence must exactly match the selected shipped fixture for each axis."
    },
    {
      "id": "R4",
      "text": "Positive Native Mobile requires a measured native/device/distribution/offline trigger plus owner, support burden, migration, rollback, and evidence."
    },
    {
      "id": "R5",
      "text": "Positive Custom Billing requires a measured provider capability gap plus billing/state requirement, owner, support burden, migration, rollback, and evidence."
    },
    {
      "id": "R6",
      "text": "Positive SaaS Multi-tenancy requires measured isolation/residency/noisy-neighbor pressure plus tenant evidence, owner, support burden, migration, rollback, and evidence."
    },
    {
      "id": "R7",
      "text": "Missing operational owner blocks USE/PILOT."
    },
    {
      "id": "R8",
      "text": "Missing decisive trigger evidence cannot produce USE/PILOT or NOT_NOW; preserve typed uncertainty."
    },
    {
      "id": "R9",
      "text": "NOT_NOW is valid only when the axis trigger is measured absent and a simpler current alternative serves the need."
    },
    {
      "id": "R10",
      "text": "Positive states require a non-empty migration_cost and rollback_path."
    },
    {
      "id": "R11",
      "text": "Every decision requires non-empty learner rationale, review_due, and stop_or_pivot_trigger."
    },
    {
      "id": "R12",
      "text": "The checker validates visible rules and fixture binding only and contains no expected-verdict oracle."
    },
    {
      "id": "R13",
      "text": "Every trigger-defining field must use the explicit visible per-axis vocabulary. UNKNOWN/UNMEASURED/UNRESOLVED/NOT_ASSESSED remain unresolved; unrecognized tokens or declared contradictory trigger evidence fail closed."
    },
    {
      "id": "R14",
      "text": "Each axis evidence object must carry the exact visible authority_refs declared for that axis: its official FACT source/claim and the shared AWR-005-K4 DESIGN trace."
    }
  ],
  "trigger_field_vocabularies": {
    "NATIVE_MOBILE": {
      "product_capability_gap": {
        "present": [
          "BACKGROUND_BLUETOOTH_REQUIRED",
          "BACKGROUND_DEVICE_WORK_REQUIRED"
        ],
        "absent": [
          "NONE_MEASURED",
          "CAMERA_FEATURE_PRESENT"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      },
      "native_only_requirement": {
        "present": [
          "PRESENT"
        ],
        "absent": [
          "ABSENT"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      },
      "device_api_requirement": {
        "present": [
          "BLUETOOTH_BACKGROUND",
          "BLUETOOTH_AND_CAMERA_BACKGROUND"
        ],
        "absent": [
          "CAMERA_FOREGROUND_ONLY",
          "NONE"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      },
      "distribution_requirement": {
        "present": [
          "MANAGED_APP_DISTRIBUTION_REQUIRED"
        ],
        "absent": [
          "NONE"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      },
      "offline_requirement": {
        "present": [
          "FIELD_OFFLINE_CAPTURE_REQUIRED"
        ],
        "absent": [
          "NONE"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      }
    },
    "CUSTOM_BILLING": {
      "billing_model": {
        "present": [
          "USAGE_BASED_CONTRACTUAL",
          "USAGE_BASED_CONTRACTUAL_INVOICING"
        ],
        "absent": [
          "STANDARD_SUBSCRIPTION",
          "NEW_PRICING_MODEL_PROVIDER_SUPPORTED"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      },
      "invoice_tax_requirement": {
        "present": [
          "CUSTOM_CONTRACT_REQUIRED",
          "CONTRACTUAL_USAGE_INVOICE_REQUIRED"
        ],
        "absent": [
          "STANDARD_PROVIDER_SUPPORTED"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      },
      "provider_capability_gap": {
        "present": [
          "PRESENT"
        ],
        "absent": [
          "ABSENT"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      }
    },
    "SAAS_MULTI_TENANCY": {
      "isolation_requirement": {
        "present": [
          "STRONG_REQUIRED"
        ],
        "absent": [
          "STANDARD_LOGICAL",
          "NONE"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      },
      "data_residency_requirement": {
        "present": [
          "REGIONAL_REQUIRED"
        ],
        "absent": [
          "NONE"
        ],
        "unresolved": [
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      },
      "noisy_neighbor_risk": {
        "present": [
          "CONTRACTUAL_ISOLATION_PRESSURE",
          "REGULATED_BLAST_RADIUS_CONCERN"
        ],
        "absent": [
          "MEASURED_ABSENT"
        ],
        "unresolved": [
          "NOT_MEASURED",
          "UNKNOWN",
          "UNMEASURED",
          "UNRESOLVED",
          "NOT_ASSESSED",
          null,
          ""
        ]
      }
    }
  },
  "authority_trace_requirements": {
    "NATIVE_MOBILE": [
      {
        "claim_ref": "lesson://AWR-005#claim/AWR-005-K1",
        "authority_class": "FACT",
        "source_id": "ANDROIDARCH"
      },
      {
        "claim_ref": "lesson://AWR-005#claim/AWR-005-K4",
        "authority_class": "DESIGN",
        "source_id": "lesson://AWR-005"
      }
    ],
    "CUSTOM_BILLING": [
      {
        "claim_ref": "lesson://AWR-005#claim/AWR-005-K2",
        "authority_class": "FACT",
        "source_id": "STRIPEBILL"
      },
      {
        "claim_ref": "lesson://AWR-005#claim/AWR-005-K4",
        "authority_class": "DESIGN",
        "source_id": "lesson://AWR-005"
      }
    ],
    "SAAS_MULTI_TENANCY": [
      {
        "claim_ref": "lesson://AWR-005#claim/AWR-005-K3",
        "authority_class": "FACT",
        "source_id": "AZTENANCY"
      },
      {
        "claim_ref": "lesson://AWR-005#claim/AWR-005-K4",
        "authority_class": "DESIGN",
        "source_id": "lesson://AWR-005"
      }
    ]
  }
}
