{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "schemas/batch_hold_adjudication.schema.json",
  "title": "anu_v3.batch_hold_adjudication.v1",
  "description": "회장 BATCH_LEVEL_HOLD_ADJUDICATION 시스템화 Track A (task-2610). 모든 track 상태를 모은 뒤 consolidated adjudication 으로 AUTHORITATIVE_PASS / HOLD_CANDIDATE / AUTO_REMEDIATION_HOLD / CHAIR_HOLD / WAITING_FOR_DEPENDENCY / NOT_STARTED_BY_DESIGN / DISPATCH_NOT_RECEIVED 7종 분류. 개별 collector 는 HOLD_CANDIDATE 만 기록·최종 분류는 본 batch-level adjudicator. Track B classifier(Critical7 여부) 입력으로 CHAIR_HOLD vs AUTO_REMEDIATION_HOLD 확정. shared invariant 파손 또는 Critical7 = 전체 CHAIR_HOLD(verdict=HOLD_FOR_CHAIR·회장 보고). 그 외 non-Critical HOLD = AUTO_REMEDIATION_HOLD 자동 수렴(회장 보고 0). independent-ANU verdict 만 authoritative — self-chain PASS 자칭만으로 AUTHORITATIVE_PASS 금지(fail-closed -> HOLD_CANDIDATE).",
  "type": "object",
  "required": [
    "schema",
    "verdict",
    "batch_classification",
    "all_settled",
    "chair_escalation_required",
    "auto_remediation_required",
    "critical7_present",
    "shared_invariant_breach",
    "track_count",
    "classification_counts",
    "tracks",
    "reasons"
  ],
  "properties": {
    "schema": { "const": "anu_v3.batch_hold_adjudication.v1" },
    "verdict": { "enum": ["PASS", "FAIL", "HOLD_FOR_CHAIR"] },
    "batch_classification": {
      "enum": [
        "AUTHORITATIVE_PASS",
        "HOLD_CANDIDATE",
        "AUTO_REMEDIATION_HOLD",
        "CHAIR_HOLD",
        "WAITING_FOR_DEPENDENCY",
        "NOT_STARTED_BY_DESIGN",
        "DISPATCH_NOT_RECEIVED"
      ]
    },
    "all_settled": { "type": "boolean" },
    "chair_escalation_required": { "type": "boolean" },
    "auto_remediation_required": { "type": "boolean" },
    "critical7_present": { "type": "boolean" },
    "shared_invariant_breach": { "type": "boolean" },
    "track_count": { "type": "integer", "minimum": 0 },
    "classification_counts": {
      "type": "object",
      "additionalProperties": { "type": "integer", "minimum": 0 }
    },
    "tracks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "track_id",
          "task_id",
          "classification",
          "chair_escalation",
          "auto_remediation",
          "settled",
          "reasons"
        ],
        "properties": {
          "track_id": { "type": "string" },
          "task_id": { "type": "string" },
          "classification": {
            "enum": [
              "AUTHORITATIVE_PASS",
              "HOLD_CANDIDATE",
              "AUTO_REMEDIATION_HOLD",
              "CHAIR_HOLD",
              "WAITING_FOR_DEPENDENCY",
              "NOT_STARTED_BY_DESIGN",
              "DISPATCH_NOT_RECEIVED"
            ]
          },
          "chair_escalation": { "type": "boolean" },
          "auto_remediation": { "type": "boolean" },
          "settled": { "type": "boolean" },
          "reasons": { "type": "array", "items": { "type": "string" } }
        },
        "additionalProperties": true
      }
    },
    "reasons": { "type": "array", "items": { "type": "string" } }
  },
  "allOf": [
    {
      "comment": "회장 §6: chair-escalation 은 Critical7 또는 shared invariant 파손일 때만. 그 때 verdict=HOLD_FOR_CHAIR & batch_classification=CHAIR_HOLD.",
      "if": { "properties": { "chair_escalation_required": { "const": true } } },
      "then": {
        "properties": {
          "verdict": { "const": "HOLD_FOR_CHAIR" },
          "batch_classification": { "const": "CHAIR_HOLD" }
        }
      }
    },
    {
      "comment": "non-Critical HOLD 는 절대 chair 로 escalate 되지 않고 AUTO_REMEDIATION_HOLD 로 자동 수렴.",
      "if": { "properties": { "batch_classification": { "const": "AUTO_REMEDIATION_HOLD" } } },
      "then": {
        "properties": {
          "chair_escalation_required": { "const": false },
          "auto_remediation_required": { "const": true },
          "critical7_present": { "const": false },
          "verdict": { "const": "FAIL" }
        }
      }
    },
    {
      "comment": "all-settled 는 AUTHORITATIVE_PASS 일 때만 & verdict=PASS.",
      "if": { "properties": { "all_settled": { "const": true } } },
      "then": {
        "properties": {
          "verdict": { "const": "PASS" },
          "batch_classification": { "const": "AUTHORITATIVE_PASS" },
          "chair_escalation_required": { "const": false }
        }
      }
    },
    {
      "comment": "verdict=PASS 는 all-settled & AUTHORITATIVE_PASS 와 동치 (self-chain PASS 자칭만으로 PASS 금지).",
      "if": { "properties": { "verdict": { "const": "PASS" } } },
      "then": {
        "properties": {
          "all_settled": { "const": true },
          "batch_classification": { "const": "AUTHORITATIVE_PASS" }
        }
      }
    },
    {
      "comment": "회장 §6 forward 강제: critical7_present=true 면 반드시 verdict=HOLD_FOR_CHAIR & batch_classification=CHAIR_HOLD (invariant 위반 출력 reject).",
      "if": { "properties": { "critical7_present": { "const": true } }, "required": ["critical7_present"] },
      "then": {
        "properties": {
          "verdict": { "const": "HOLD_FOR_CHAIR" },
          "batch_classification": { "const": "CHAIR_HOLD" }
        }
      }
    },
    {
      "comment": "회장 §6 forward 강제: shared_invariant_breach=true 면 반드시 verdict=HOLD_FOR_CHAIR & batch_classification=CHAIR_HOLD (invariant 위반 출력 reject).",
      "if": { "properties": { "shared_invariant_breach": { "const": true } }, "required": ["shared_invariant_breach"] },
      "then": {
        "properties": {
          "verdict": { "const": "HOLD_FOR_CHAIR" },
          "batch_classification": { "const": "CHAIR_HOLD" }
        }
      }
    }
  ],
  "additionalProperties": true
}
