{
  "schema": "dispatch-package-entry-wiring-audit.remediation_proposal.v1",
  "ts_kst": "2026-05-20 14:50 KST",
  "mode": "proposal-only · 자동 진행 0 · 회장 결정 대기",
  "context_anchor": "wiring_matrix.json + task-2620 scope-clarification (ledger line 48) 확정 후 — production dispatch.dispatch() 본체에 callback owner enforcement code-level gate 부재 확인",
  "proposed_chair_authorized_task": {
    "candidate_name": "DISPATCH_INIT_PRODUCTION_PATH_CALLBACK_CONTRACT_WIRING",
    "scope_proposed": "dispatch/__init__.py:dispatch() 본체(라인 ~2881·3850 cokacdir --cron 호출 직전)에 callback owner enforcement gate 를 ADDITIVE 로 결선. (a) build_anu_owned_callback_request 또는 enforce_callback_owner 를 prompt 조립 직후·cokacdir 호출 직전에 호출하여 callback owner=ANU key 강제 (b) fallback safety-net 자동 등록 helper 호출(현재 live ANU 수동 등록 의존 → 자동화)",
    "scope_excluded_explicit": "Track C(task-2619) 미접촉 · zombie cron 정리 미수행 · CLOSED_ALL_SETTLED 산출물 변조 0 · S03~S07 별도 backlog · §C T01~T05 telemetry 별도 backlog · baseline 13 regression fails 별도 backlog · test_orchestration_runtime_2514.py import error 별도 backlog",
    "expected_files_candidate": [
      "dispatch/__init__.py (ADDITIVE wiring at lines ~2881 and ~3850 직전 · build_prompt 직후 owner gate · cokacdir 직전 verify · 기존 dispatch flow byte-0 preserve)",
      "tests/regression/test_dispatch_init_callback_wiring.py (신규 · production-path enforcement 실증 regression)",
      "memory/events/<task_id>.{decision,result}.json + memory/reports/<task_id>.md"
    ],
    "files_explicitly_byte_0_required": [
      "anu_v3/dispatch_callback_contract.py (task-2620 산출 · API byte-0)",
      "dispatch/normal_fallback_callback_helper.py (Site #2 enforcement chain byte-0)",
      "dispatch/callback_owner_enforcer.py + cron_dispatch_guard.py + executor_completion_contract.py (+49 era · byte-0)",
      "dispatch.py shim + dispatch/core.py + dispatch/prompt.py facades (byte-0 · 또는 import만 ADDITIVE 가능하나 caller 영향 0)",
      "CLOSED_ALL_SETTLED 산출물(task-2610~2615 · scripts/run_batch_hold_adjudicator.py · sample.*.json · callback_4tuple_index.jsonl 기존 48행 byte-0 prefix)"
    ]
  },
  "risk_assessment": {
    "blast_radius": "HIGH — dispatch/__init__.py 는 4336-line 운영 core. 모든 team dispatch 가 이 함수를 거침. 잘못된 ADDITIVE 가 production dispatch 를 break 시킬 위험.",
    "mitigation": "wiring 은 ADDITIVE only · 기존 호출 시그니처 byte-0 · 게이트는 PASS-path 무영향 fail-closed 만(잘못된 owner key 입력 시에만 raise) · pre-merge regression(기존 + 신규 production-path enforcement) · git EQUAL(ANU Layer-A no-git) 유지 · 단계적 enable(우선 1 호출 site, 검증 후 두번째)",
    "critical7_assessment": {
      "is_critical7": false,
      "rationale": "본 gap 은 defense-in-depth 부재이지 활성 침해 아님 — credential write 0 · forbidden-path 활성 위반 0 · permission expansion 활성 0 · scope expansion 활성 0. non-Critical HIGH 분류(detection coverage 강화·SAFE 방향). 단 회장 승인이 필요한 이유=blast radius 큼."
    },
    "loop_boundary_consideration": "본 task 는 dispatch.dispatch() entry 결선 1라운드 한정. 동일 함수/file-boundary HIGH 가 결선 후에도 반복되면 feedback_auto_remediation_loop_boundary_review 발동(현재는 첫 라운드 아님 — 회장 인가 범위 내 진행 가능)."
  },
  "regression_candidate_outline": [
    "(R1) production path enforcement: dispatch.dispatch(team='X', task_desc='...', callback_owner='executor_self_key') → fail-closed(ExecutorSelfKeyForbidden raise · cokacdir invoke 0 · 산출물 0)",
    "(R2) PASS path no-regression: dispatch.dispatch(team='X', task_desc='...', callback_owner=ANU_KEY) → 기존과 동일 PASS · cokacdir 정상 invoke",
    "(R3) fallback safety-net 자동 등록 검증: dispatch 후 ANU-key fallback safety-net cron 등록 흔적(--cron-list 또는 schedule_history)",
    "(R4) no-dual-purpose preservation: fallback 은 recovery 전용 · final-report 책임 0(feedback_no_dual_purpose_watcher 정합)",
    "(R5) cancel-on-success: normal callback durable-success 확정 후 fallback 자동 제거",
    "(R6) Site #1/#2 byte-0 invariant: 본 task 변경이 task-2620 surface re-export/Site #2 enforcement chain 을 byte-0 유지",
    "(R7) 기존 dispatch.dispatch flow(기존 team dispatch · composite dispatch · _retry_with_fallback_key 등) 무회귀 — 기존 dispatch path regression 전수 PASS"
  ],
  "codex_lint_required": true,
  "anu_codex_lint_strategy": "PRE-DISPATCH SPEC · feedback_spec_lint_not_implementation_check 정합 · spec sha256 pin · scope coherence + doctrine alignment + production-path 결선 명료성 + ADDITIVE only + byte-0 invariant 명시 + Critical7 false 명확화 검증",
  "chair_approval_required": true,
  "approval_basis": [
    "회장 정정 verbatim: 'dispatch 패키지 진입(dispatch/__init__.py 또는 실 dispatch 함수) 결선 audit + wiring 은 별도 chair-authorized task 로 분리. 자동 진행 0' (ledger line 48 task-2620 scope-clarification)",
    "회장 결정 필요 항목: (a) wiring 진행 여부 (b) 1라운드 scope(1 site 또는 2 site) (c) dispatch_callback_contract 사용 vs callback_owner_enforcer 사용 vs 두 시스템 통합 (d) blast radius mitigation 단계 (e) 회장 모니터링 수준"
  ],
  "backlog_items_kept_separate": {
    "S03_S07_OUT_OF_SCOPE_DOCUMENTED_5_sites": "task-2620 audit 산출 · 본 audit 재평가 안함 · 별도 backlog",
    "section_2C_telemetry_T01_T05": "task-2620 §2.C read-only 후보 · 구현 0 · 별도 backlog",
    "baseline_13_pre_existing_regression_fails": "별도 hygiene · backlog",
    "test_orchestration_runtime_2514_import_error": "별도 hygiene · backlog",
    "Track_C_task_2619_finish_task_git_evidence": "별도 회장 승인 동결 유지 · 본 audit 미접촉",
    "zombie_cron_dev2_dev8_8_residual": "별도 hygiene · backlog · cross-watcher 간섭 0",
    "two_callback_enforcement_systems_consolidation": "+49 era callback_owner_enforcer vs task-2614 dispatch_callback_contract 통합/조정 — 본 task 가 통합 결정 포함하면 scope 비대 → 별도 검토 후보(회장 결정)"
  },
  "what_NOT_to_do_in_this_proposal": [
    "기존 CLOSED_ALL_SETTLED 산출물 byte-0 변경 금지",
    "task-2620 wiring/clarification 정정 금지(보강 추가만 가능)",
    "Track C 수정 절대 금지",
    "zombie cron 자동 정리 금지",
    "+49 era 모듈과 task-2620 모듈 강제 merge 금지(별도 결정)",
    "production-path 외 새 dispatch 자동 추가 금지",
    "회장 승인 전 자동 진행 0"
  ]
}
