{
  "schema": "callback_self_key_root_cause_audit.v1",
  "ts_kst": "2026-05-21 12:40 KST",
  "mode": "read-only audit · proposal-only · 코드 수정 0 · dispatch path 변경 0 · 새 remediation 0",
  "trigger": "task-2625 D4CE6C8D self-collector (회장 결정 2026-05-21)",
  "classification": ["NORMAL_CALLBACK_SELF_KEY_REGISTRATION", "SELF_COLLECTOR_FORBIDDEN"],
  "is_critical7": false,
  "anu_v3_closure_blocker": true,
  "chair_6_items": {
    "1_task2625_independent_anu_reverify": {
      "verdict": "PASS",
      "artifact": "memory/events/task-2625.independent_anu_reverify.result.json",
      "summary": "deliverable 3 files 정확 · regression 15 passed · additive · qc-result/forbidden 무변경. self-collector 와 무관하게 독립 ANU 재검증 PASS. durable-success write-back 보류(회장 금지). minor LOC 초과(~175 vs ~50) finding 1건."
    },
    "2_D4CE6C8D_self_key_registration_evidence": {
      "verdict": "CONFIRMED_SELF_KEY",
      "evidence": [
        "cron-history D4CE6C8D --key 1e41a2324a3ccdd0 (페룬) → count:1 (등록 존재)",
        "cron-history D4CE6C8D --key c119085addb0f8b7 (ANU) → count:None (등록 없음)",
        "collector 시작 12:15:50 = 페룬 본작업 세션 C0B28DE4 종료(12:15:46) 4초 후",
        "collector workspace = /home/jay/.cokacdir/workspace/D4CE6C8D (페룬 spawn)",
        "result.json callback_cron_id=D4CE6C8D · callback_registration_status=REGISTERED_NOT_YET_FIRED (봇 종료 시점)"
      ],
      "conclusion": "D4CE6C8D 는 executor(페룬) self-key 로 등록·발화. 본작업 봇이 4초 후 collector 재진입 = self-collector."
    },
    "3_task2621_wiring_key_selection_path": {
      "verdict": "HELPER_CORRECT_BUT_NOT_WIRED_TO_BOT_FIRE_PATH",
      "findings": [
        "dispatch/normal_fallback_callback_helper.py:build_anu_owned_callback_request — ANU key fail-closed. owner_key != ANU key 면 argv=None (등록 불가). enforce_callback_owner + _dcc_assert_independent_anu 이중 gate. 코드 자체는 정확.",
        "그러나 dispatch/__init__.py 가 normal_fallback_callback_helper / build_anu_owned_callback_request / operational_collector_wiring / callback_owner_enforcer / executor_completion_contract 를 import 0 (grep 빈 출력).",
        "dispatch/__init__.py 의 callback 관련 = COKACDIR_KEY_ANU env 2곳 (L231 key 매핑, L4154 cron-remove) 뿐.",
        "dispatch/executor_completion_contract.py = 'executor completion callback MANDATORY' 룰을 선언/검증만 (NO-CRON · zero-mutation · 실제 cron 발사 0).",
        "prompts/DIRECT-WORKFLOW.md / scripts/finish-task.sh = 봇 callback 발사 코드 강제 0 (grep 빈 출력)."
      ],
      "conclusion": "helper 는 ANU control layer 전용. 봇의 실제 callback 발사 경로(executor completion → cokacdir --cron)에 결선 0. 회장 task-2620 ACCEPT caveat 'production dispatch 본체에 callback contract code-level 결선 0' 의 정확한 실증."
    },
    "4_anu_key_callback_bypass_cause": {
      "verdict": "BOT_AUTONOMOUS_FIRE_NO_CODE_ENFORCEMENT",
      "mechanism": [
        "봇(페룬)이 task md §8 텍스트 지시('normal callback ANU key c119085a 발사 · 자기 key 절대 금지')를 받음.",
        "그러나 실제 발사는 봇 자율 — 봇 세션에서 cokacdir --cron 을 자기 봇 key(1e41a232)로 실행.",
        "helper 의 ANU-key fail-closed gate 는 봇 발사 경로를 통과하지 않으므로 우회됨.",
        "텍스트 지시(task md §8)만 있고 코드 강제(helper 결선)가 없어 봇이 self-key 로 발사 가능."
      ],
      "conclusion": "ANU-key callback 우회 = 텍스트 doctrine 만 존재 · 코드 강제 부재. feedback_callback_must_spawn_independent_anu_not_executor_self 가 코드로 enforce 안 됨."
    },
    "5_canonical_root_miss_cause": {
      "verdict": "SELF_KEY_SPAWN_IN_EXECUTOR_WORKSPACE",
      "mechanism": [
        "collector(D4CE6C8D)가 페룬 key 로 spawn → workspace /home/jay/.cokacdir/workspace/D4CE6C8D.",
        "memory/ 는 canonical root /home/jay/workspace/ 에 위치.",
        "collector 가 자기 workspace 에서 memory/ 못 찾고 .worktrees 헤맴 (12:16 'files aren't at expected paths... .worktrees directory').",
        "ANU key 였다면 ANU canonical root(/home/jay/workspace)에서 spawn 됐을 것."
      ],
      "conclusion": "canonical root 미발견 = self-key callback 의 부수효과. feedback_callback_session_discontinuity_and_canonical_root_260518 패턴."
    },
    "6_fix_needed_and_expected_files_candidates": {
      "fix_needed": true,
      "fix_principle": "봇 callback 발사 경로를 helper(build_anu_owned_callback_request)를 거치도록 결선 또는 봇이 ANU key 로만 발사하도록 코드 강제. 텍스트 doctrine → 코드 enforce 전환.",
      "expected_files_candidates": [
        "dispatch/executor_completion_contract.py 또는 신규 봇 발사 wrapper (봇 completion → ANU-keyed cokacdir --cron 강제)",
        "prompts/DIRECT-WORKFLOW.md (봇 발사 스텝을 helper 경유로 명시 · 단 텍스트만으론 부족)",
        "dispatch/normal_fallback_callback_helper.py (봇 발사 경로 결선 hook 추가)",
        "scripts/finish-task.sh (finish 시 ANU-key callback 발사 결선 — 봇 자율 제거)"
      ],
      "exact_location_needs_followup": "봇이 실제 어디서 cokacdir --cron 을 self-key 로 발사하는지(봇 런타임 코드/프롬프트)는 별도 audit 필요. 봇 세션 내부 동작이라 main repo 코드에 발사 경로가 없을 수 있음(봇 자율).",
      "fix_authority": "회장 명시 'audit/proposal 까지만 · 코드 수정 0' → 본 audit 은 proposal 만. 실 수정은 별도 chair-authorized task."
    }
  },
  "self_collector_artifact_disposition": {
    "path": "memory/events/task-2625.anu_collection.result.json",
    "authority": "NON_AUTHORITATIVE",
    "action": "비-authoritative 마킹 · 삭제 0 (히스토리 보존)",
    "authoritative_replacement": "memory/events/task-2625.independent_anu_reverify.result.json (ANU 독립)"
  },
  "scope_invariants_preserved": [
    "read-only audit", "proposal-only", "코드 수정 0", "dispatch path 변경 0",
    "새 remediation 0", "self-collector 결과 비-authoritative", "durable-success write-back 0",
    "PR/merge/branch/main/credential write 0"
  ],
  "auto_progress": false,
  "chair_approval_required": true
}
