# DISPATCH_PACKAGE_ENTRY_WIRING_AUDIT — read-only audit (회장 직접 결정 후속)

**ts**: 2026-05-20 14:50 KST · **mode**: audit-only · read-only · no-code-change · no-dispatch · no-remediation · no-new-cron · **proposal-only**.

## 핵심 발견 (회장 caveat 정확 — 더 넓은 wiring gap 확인)

회장 task-2620 scope-clarification(ledger line 48) verbatim 안티-overclaim 박제가 정확히 맞습니다. 본 audit는 그 caveat가 **더 깊은 사실**을 가리키고 있음을 source-of-truth로 확인:

**일상 dispatch 표준 경로** (CLAUDE.md): `python3 /home/jay/workspace/dispatch.py --team <team> --task-file <path> --level <normal|critical|security>`

**실 호출 체인**:
```
dispatch.py (shim 67 lines)
  → dispatch/core.py:main (re-export)
  → dispatch/__init__.py:main (L4226)
  → dispatch/__init__.py:dispatch (L3282 — production fn)
  → dispatch/__init__.py:build_prompt (L1924 — prompts.team_prompts에 delegate)
  → subprocess.run(cokacdir --cron --key BOT_KEYS[team]) (L2881·L3850)
```

**결정적 증거 (grep source-of-truth, 3건 모두 0 hits)**:
- `dispatch/__init__.py` 본체에서 `callback_owner_enforcer / enforce_callback_owner / guard_callback_registration / cron_dispatch_guard / build_anu_owned_callback_request / verify_post_registration_owner` 호출 = **0**
- `dispatch/__init__.py` 본체에서 `assert_collector_key_is_independent_anu / dispatch_callback_contract / normal_fallback_callback_helper` 호출 = **0**
- `dispatch.dispatch()` 함수 본체(3282~3700)에서 `callback_4tuple / append.*ledger / append.*durable_success` 호출 = **0**

즉 **두 callback enforcement 시스템**(둘 다 코드로 존재)이 **production dispatch.dispatch() 본체에 code-level 결선 0**:
1. **+49 era 시스템**: `dispatch/callback_owner_enforcer.py`(30k) + `dispatch/cron_dispatch_guard.py`(21k) + `dispatch/executor_completion_contract.py`(7.8k) + `anu_v3/callback_owner_validator.py` 등 — facade(`dispatch/core.py`·`dispatch/prompt.py`·`dispatch.py` shim)로 re-export 되지만 production fn 미호출
2. **task-2614/2620 시스템**: `anu_v3/dispatch_callback_contract.py`(19k) — Site #1(shim re-export) + Site #2(`normal_fallback_callback_helper` 내부 chain 정합)만 결선 · production fn 미호출

## Site 재분류 표

| Site | 위치 | 분류 | 근거 |
|---|---|---|---|
| Site #1 | `dispatch.py` shim task-2620 §2.1 ADDITIVE PATCH | **SURFACE_REEXPORT_ONLY** | import 만 추가 · production path 가 본 re-export 를 호출 안 함 (회장 caveat 정확) |
| Site #2 | `dispatch/normal_fallback_callback_helper.py:build_anu_owned_callback_request` (L148~169 §2.1) | **WIRED_HELPER_BUILDER** | helper 내부 enforcement chain 은 fail-closed 정합 · 그러나 production dispatch.dispatch() 가 helper 를 호출하지 않음 |
| `scripts/run_batch_hold_adjudicator.py` | task-2615 dogfood | WIRED_SCRIPT_ONLY | sample dogfood 한정 |
| `tests/regression/test_dispatch_callback_contract.py` | 12 regression cases | WIRED_TEST_ONLY | runtime 검증 한정 |
| **`dispatch/__init__.py:dispatch` (L3282)** | **production fn** | **NOT_WIRED** | grep 0 hits · code-level gate 부재 |
| `dispatch/__init__.py:build_prompt` (L1924) | prompt 조립 | NOT_WIRED | delegate only · callback contract 호출 0 |
| `dispatch/core.py` · `dispatch/prompt.py` | facade | SURFACE_REEXPORT_ONLY | re-export 만 · 본체 호출 0 |
| S03~S07 | task-2620 OUT_OF_SCOPE_DOCUMENTED 5 사이트 | UNKNOWN_NEEDS_FOLLOWUP | 본 audit 미평가 · 별도 backlog |

## 운영이 작동해온 이유 (gap이 존재해도)

- (a) **prompt-instruction**: dispatch prompt 텍스트가 executor에게 ANU-key normal callback 발사를 명시
- (b) **collector-side validation**: callback이 발사되어 spawn된 collector 세션에서 `callback_owner_enforcer`가 invoke되어 fail-closed
- (c) **live ANU 수동 fallback 등록**: BATCH_LEVEL_HOLD 체인 동안 ANU가 dispatch 시점에 별도 `cokacdir --cron`으로 fallback safety-net을 수동 등록
- 셋 조합으로 BATCH_LEVEL_HOLD 6 task 전수 durable-success 실증(ledger 48행·git EQUAL·PR/merge/credential 0)

## 위험도 평가

- **Critical7 false**: 활성 침해 아님 — credential write 0 · forbidden-path 활성 위반 0 · permission expansion 활성 0 · scope expansion 활성 0
- **non-Critical HIGH (defense-in-depth absent)**: code-level gate 부재로 prompt drift / executor 비협조 / live ANU 누락 시 단일 실패점 노출
- **shared invariant broken**: false
- **loop-boundary review triggered**: false (첫 라운드 아님 · 회장 인가 범위 내 진행 가능)
- **즉시 회장 보고 트리거**: false (회장 강화원칙 1 정합 · Critical7/credential/permission/forbidden-path/scope-expansion 활성 아님)

## remediation proposal (자동 진행 0·회장 결정 대기)

후보 chair-authorized task: **DISPATCH_INIT_PRODUCTION_PATH_CALLBACK_CONTRACT_WIRING**
- scope: `dispatch/__init__.py:dispatch()` 본체(L2881·L3850 cokacdir 호출 직전)에 callback owner enforcement gate를 ADDITIVE로 결선
- blast radius: HIGH (4336-line core 변경)
- mitigation: ADDITIVE only · 기존 시그니처 byte-0 · PASS-path 무영향 · 단계적 enable
- Codex lint: 필요(PRE-DISPATCH SPEC 정합·spec sha256 pin)
- 회장 승인: 필요(회장 verbatim "별도 chair-authorized task 로 분리")
- 자동 진행: **0**

상세는 `memory/events/dispatch-package-entry-wiring-audit.remediation_proposal.json` 정본 참조.

## backlog 유지(본 audit scope 외)

- S03~S07 OUT_OF_SCOPE_DOCUMENTED 5 사이트
- §2.C T01~T05 telemetry(read-only 후보 박제만)
- baseline 13 pre-existing regression fails
- `tests/regression/test_orchestration_runtime_2514.py` import error
- Track C task-2619 finish-task.sh/git_evidence(회장 동결 유지)
- dev2/dev8 zombie cron 8건(cross-watcher 간섭 0)
- +49 era / task-2614~2620 두 시스템 통합 검토(회장 결정 사항)

## audit invariants 보존

- 코드 수정 **0** · 새 dispatch **0** · 새 cron **0** · remediation **0**
- PR/merge/branch/main/credential write **0**
- git HEAD `20456b5f` EQUAL · branch 불변 · commits 0(ANU Layer-A no-git)
- CLOSED_ALL_SETTLED 산출물 byte-0 · `callback_4tuple_index.jsonl` 48행 byte-0 prefix(append 0)
- task-2620 ACCEPT + scope-clarification 정합 · Track C 미접촉 · zombie cron 미접촉

## 9-item 보고 → `dispatch-package-entry-wiring-audit.result.json` 정본

## 다음 결정 = 회장
