{
  "schema": "anu_v3.callback_gap_recovery.dogfood.v1",
  "task_id": "task-2615",
  "track": "F.§6b",
  "purpose": "회장 §6b 야간 필수 보강 — callback-gap recovery watcher end-to-end 실증 산출 (mock-only FAIL · 진행트리거화 0 · self-key fail-closed).",
  "started_at_utc": "2026-05-20T02:04:56Z",
  "finished_at_utc": "2026-05-20T02:04:56Z",
  "callback_owner_policy": {
    "must_use_independent_anu_key": "c119085addb0f8b7",
    "executor_self_key_forbidden": "109fa85250c6d46b",
    "doctrine": "+49 정본 / §7b 야간 verbatim"
  },
  "acceptance_gate": {
    "all_settled": true,
    "needed": {
      "task-2610": "dc4e299fdc25108a5e87afd5c8602294c460f0a4a43903c824b840a1484b26fd",
      "task-2611+2": "0cdc1259f2eb3fae5e77393620f6ea90edde6391bd384a31b8154e0ef6856f56",
      "task-2612+3": "dc62a81223117f68c7404672800cae9a5e0649dd54abcb1bad0c5a4cdab66d5e",
      "task-2613": "576ac7996e47d8b388776e127d7439a377ea1b3a03e31e288e50a0127b210f3c",
      "task-2614": "1c9d8c54d407c4c1dacb9e23d90b30cb809e6f1fc5b46e917cbb802edf9abe39"
    },
    "observed": {
      "task-2610": "dc4e299fdc25108a5e87afd5c8602294c460f0a4a43903c824b840a1484b26fd",
      "task-2611+2": "0cdc1259f2eb3fae5e77393620f6ea90edde6391bd384a31b8154e0ef6856f56",
      "task-2612+3": "dc62a81223117f68c7404672800cae9a5e0649dd54abcb1bad0c5a4cdab66d5e",
      "task-2613": "576ac7996e47d8b388776e127d7439a377ea1b3a03e31e288e50a0127b210f3c",
      "task-2614": "1c9d8c54d407c4c1dacb9e23d90b30cb809e6f1fc5b46e917cbb802edf9abe39"
    },
    "writeback_id_match": true,
    "mismatched": [],
    "ledger_path": "memory/events/callback_4tuple_index.jsonl",
    "gate_kind": "EVENT_GATED",
    "fixed_time_or_dead_man": false
  },
  "module_provenance": {
    "track_A_batch_hold_adjudicator": {
      "path": "anu_v3/batch_hold_adjudicator.py",
      "sha256": "2683b473535befd0b110ffe904babd3d4a118034c7315ba070c96e03d71dadd3"
    },
    "track_B_auto_remediation_planner": {
      "path": "anu_v3/auto_remediation_planner.py",
      "sha256": "c5d8353837e2e19724c910ca7b6f40f35228aaa27a42b3611cd9b20b1c028854"
    },
    "track_C_critical7_classifier": {
      "path": "anu_v3/critical7_classifier.py",
      "sha256": "6143a2d25fff1f15201feb461c9ce28e62d3400f5893264fe445d311fe4877f2"
    },
    "track_D_batch_dependency_classifier": {
      "path": "anu_v3/batch_dependency_classifier.py",
      "sha256": "7e1bad7ff8c4811b10cda20b80809dcafe69f05e30de341ba72c01af123b7fc2"
    },
    "track_E_dispatch_callback_contract": {
      "path": "anu_v3/dispatch_callback_contract.py",
      "sha256": "e2be73ebe939874d371c0a05a229578fde285995c29c4cbc336c72722abb2480"
    }
  },
  "fixture_provenance": {
    "2604": {
      "path": "memory/fixtures/task-2614.case-2604.json",
      "sha256": "add76a7880d5565af2d3473f0589beaab32f4cf5223d088f203cf306c7d0b46d"
    },
    "2605": {
      "path": "memory/fixtures/task-2614.case-2605.json",
      "sha256": "92f1d4e620513425afe3453ad9fe284c76fda4b106790845b608bb6e65e057ce"
    },
    "2608": {
      "path": "memory/fixtures/task-2614.case-2608.json",
      "sha256": "d03014689a8f1b646109ccb6550612d29d8ec10327eb813b46414371f083f69e"
    },
    "2609": {
      "path": "memory/fixtures/task-2614.case-2609.json",
      "sha256": "02da1177def0656d240336fb5e71ba2882d1f307fb3f86d25ba0c1caecaa528b"
    },
    "callback_gap": {
      "path": "memory/fixtures/task-2614.case-callback-gap.json",
      "sha256": "ac9dc14a9e49a48882f9838589235961631d33842fd72d651486424b599b8e36"
    }
  },
  "scenarios": {
    "module_calls": [
      "anu_v3.dispatch_callback_contract.classify_dispatch_contract",
      "anu_v3.dispatch_callback_contract.evaluate",
      "anu_v3.dispatch_callback_contract.RecoveryWatcher.maybe_spawn",
      "anu_v3.dispatch_callback_contract.assert_collector_key_is_independent_anu"
    ],
    "fixture_used": "memory/fixtures/task-2614.case-callback-gap.json",
    "fixture_sha256": "ac9dc14a9e49a48882f9838589235961631d33842fd72d651486424b599b8e36",
    "cases": {
      "a_contract_ok": {
        "input": {
          "normal": true,
          "fallback": true,
          "result": true
        },
        "classification": "CONTRACT_OK",
        "fallback_cancel_on_success": true,
        "recovery_required": false,
        "want_classification": "CONTRACT_OK",
        "match": true
      },
      "b_fallback_recovery": {
        "input": {
          "normal": false,
          "fallback": true,
          "result": true
        },
        "classification": "FALLBACK_RECOVERY",
        "recovery_required": false,
        "recovery_is_fixed_time_or_dead_man": false,
        "want_classification": "FALLBACK_RECOVERY",
        "match": true
      },
      "c_dispatch_contract_violation_fixture": {
        "fixture": "memory/fixtures/task-2614.case-callback-gap.json",
        "observation": {
          "task_id": "task-2612+3",
          "normal_callback_present": false,
          "fallback_present": false,
          "result_present": true,
          "collector_key": "c119085addb0f8b7"
        },
        "classification": "DISPATCH_CONTRACT_VIOLATION",
        "recovery_required": true,
        "recovery_is_fixed_time_or_dead_man": false,
        "collector_key": "c119085addb0f8b7",
        "executor_self_key_forbidden": true,
        "expected": {
          "classification": "DISPATCH_CONTRACT_VIOLATION",
          "recovery_required": true,
          "recovery_is_fixed_time_or_dead_man": false,
          "collector_key": "c119085addb0f8b7",
          "executor_self_key_forbidden": true,
          "recovery_watcher": {
            "spawn_condition_met": true,
            "spawn_count_on_repeat_calls": 1,
            "duplicate_spawn": 0,
            "spawns_independent_anu_collector_only": true
          }
        },
        "match": true
      },
      "d_idempotent_single_spawn": {
        "first_call": {
          "spawned": true,
          "duplicate_suppressed": false,
          "classification": "DISPATCH_CONTRACT_VIOLATION"
        },
        "second_call": {
          "spawned": false,
          "duplicate_suppressed": true,
          "classification": "DISPATCH_CONTRACT_VIOLATION"
        },
        "actual_spawn_count": 1,
        "want_actual_spawn_count": 1,
        "spawn_targets": [
          [
            "task-2612+3",
            "c119085addb0f8b7"
          ]
        ],
        "watcher_seen_keys": [
          "dispatch_callback_contract:task-2612+3"
        ],
        "match": true
      },
      "e_no_op_condition_not_met": {
        "input": {
          "task_id": "task-2615.dogfood.e",
          "normal_callback_present": true,
          "fallback_present": false,
          "result_present": true,
          "collector_key": "c119085addb0f8b7"
        },
        "spawned": false,
        "classification": "CONTRACT_OK",
        "fixed_time_or_dead_man": false,
        "actual_spawn_count": 0,
        "want_actual_spawn_count": 0,
        "match": true
      },
      "f_self_key_fail_closed": {
        "case_canonical_self_key": "1e41a2324a3ccdd0",
        "case_canonical_caught": true,
        "case_canonical_error": "executor self-key '1e41a2324a3ccdd0' 는 collector/adjudication/dispatch 에 절대 사용 불가 — 독립 ANU key 전용(+49 정본)",
        "case_executor_self_key": "109fa85250c6d46b",
        "case_executor_caught": true,
        "case_executor_error": "collector key '109fa85250c6d46b' 는 독립 ANU key(c119085addb0f8b7) 가 아님 — fail-closed(self-chain 약화 금지)",
        "match": true
      }
    },
    "all_passed": true,
    "failures": []
  },
  "anti_pattern_640665C8_blocked": true,
  "all_passed": true
}