{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "schemas/non_blocking_fallback_schema.json",
  "title": "task-2553+58.non_blocking_fallback_mark_v1",
  "description": "task-2553+58 (TRACK C) 회장 §2 — normal callback durable-success 이후 잔존하는 bound fallback 이 cancel-on-success 로 제거되지 않았을 때, registry 에 명시적으로 기록되어야 하는 NON_BLOCKING(legacy/safety-net) 마크 1건의 스키마. 이 마크가 schema-valid 하게 존재할 때만 §2 기준 (b) registry NON_BLOCKING 명시 마크가 충족된다. 마크 없이 fallback 이 발화한 뒤 DUPLICATE_CALLBACK_IGNORED 로만 처리되는 것은 안전성 OK 이나 운영 품질 PASS 가 아니다 (criteria.anti_pattern). 본 마크는 fallback safety path 를 약화하지 않으며(normal_success_unchanged const true), fallback 을 진행 트리거로 승격하지 않는다(progress_trigger const false). owner/chat 은 +49 코드 정본의 ANU key 로 고정한다 (executor self key 금지).",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema",
    "task_id",
    "fallback_cron_id",
    "owner_key",
    "chat_id",
    "bound_after_normal_durable_success",
    "classification",
    "marked_at_kst",
    "marked_by_collector_role",
    "basis",
    "normal_success_unchanged",
    "expected_on_fire",
    "progress_trigger",
    "cancel_on_success_eligible",
    "cancel_on_success_applied"
  ],
  "properties": {
    "schema": {
      "const": "task-2553+58.non_blocking_fallback_mark_v1"
    },
    "task_id": {
      "type": "string",
      "minLength": 1,
      "description": "마크가 가리키는 task (durable-success 가 선행한 그 task)."
    },
    "fallback_cron_id": {
      "type": "string",
      "minLength": 1,
      "description": "NON_BLOCKING 으로 명시 마크되는 bound fallback cron id. observation 의 fallback_cron_id 와 일치해야 §2 기준 (b) 충족 (criteria.criterion_b.semantic_binding)."
    },
    "owner_key": {
      "const": "c119085addb0f8b7",
      "description": "+49 코드 정본 ANU key. executor self key 등 비-ANU owner 의 마크는 무효 (§2/§5/§7)."
    },
    "chat_id": {
      "const": 6937032012,
      "description": "ANU 소유 chat. 불일치 시 마크 무효."
    },
    "bound_after_normal_durable_success": {
      "const": true,
      "description": "이 마크는 normal callback durable-success 가 선행한 fallback 에만 의미가 있다. durable-success 선행이 아니면 fallback 발화는 정당 recovery 이며 본 기준 비적용(NOT_APPLICABLE)."
    },
    "classification": {
      "enum": [
        "NON_BLOCKING",
        "LEGACY_PENDING"
      ],
      "description": "NON_BLOCKING = 운영상 비차단 safety-net 임을 명시. LEGACY_PENDING = legacy 잔여 safety-net(미제거) 명시. 둘 다 §2 기준 (b) 를 충족 (legacy-pending-fallback-inventory findings.7 와 정합)."
    },
    "marked_at_kst": {
      "type": "string",
      "minLength": 1,
      "description": "마크 기록 시각 (KST)."
    },
    "marked_by_collector_role": {
      "const": "ANU",
      "description": "마크는 독립 ANU collector 세션이 기록한다. executor self-* 가 기록한 마크는 무효 (§5/§7)."
    },
    "basis": {
      "type": "string",
      "minLength": 1,
      "description": "마크 근거 (예: durable-success registry line 참조, batch ALL_SETTLED 등). silent skip 금지 — 근거 명시 필수."
    },
    "normal_success_unchanged": {
      "const": true,
      "description": "디커플 절대불변 — 본 마크/처리가 normal collector success 를 절대 뒤집지 않는다 (+45 cancel-audit 9-R Layer A/B 와 정합). false 면 SAFETY_FAIL."
    },
    "expected_on_fire": {
      "enum": [
        "NO-ACTION",
        "DUPLICATE_CALLBACK_IGNORED"
      ],
      "description": "마크된 fallback 이 그래도 발화할 경우 기대 동작. recovery 실행이 아니라 비차단 무동작이어야 NON_BLOCKING 명시와 정합."
    },
    "progress_trigger": {
      "const": false,
      "description": "fallback 은 진행 트리거가 아니다 (회장 doctrine·+55 핵심원칙). NON_BLOCKING 마크는 fallback 을 진행 트리거로 승격하지 않음을 명시."
    },
    "cancel_on_success_eligible": {
      "type": "boolean",
      "description": "cancel-on-success 적용 대상 여부 (관측). 대개 true (cancel-on-success live adoption 시 (a) 경로로 전환 가능)."
    },
    "cancel_on_success_applied": {
      "const": false,
      "description": "본 마크는 §2 기준 (b) 경로 — cancel-on-success 로 제거되지 않은 fallback 의 명시 마크. cancel-on-success 가 적용되었다면 그것은 기준 (a) 이며 별도 마크 불요(criteria.mutual_exclusivity)."
    }
  }
}
