# P0B event strategy WIRING 설계 packet (read-only 분석, 260617)

상태: `P0B_EVENT_STRATEGY_WIRING_DESIGN_PACKET_READY_ACTIVE_FALSE` · ACTIVE=false · ★설계 packet만 — 코드/PR/canary 0. canonical main 206b3ecd 기준.

## 1. 현재 event strategy move-first 코드 위치
- 파일: `dispatch/anu_pickup_driver.py` (PR #243 merged, main 진입)
- 함수: **`scan_live_inbox_once`** (live inbox scan + move-first)
- 상태 enum: `VERDICT_LIVE_PROCESSED` / `LIVE_SKIP_DEDUPE` / `LIVE_PENDING_BUSY` / `LIVE_PENDING_OWNER` / **`LIVE_PENDING_MOVE`**
- 핵심 불변식(main 진입분): move **성공 후에만** completed ledger 기록 / move 실패 시 **미기록 + LIVE_PENDING_MOVE + inbox 잔존**(재처리) / dedupe `(task_id, source_result_sha256)` / busy=PENDING_BUSY(지연) / owner_proof gate(self-collector 방지) / legacy result 구조적 제외

## 2. 현재 운영 경로 분석
```
systemd anu-pickup.path (PathExistsGlob=memory/events/p0b_inbox/task-*.result.json)  ← legacy inbox
  → anu-pickup.service (ExecStart: anu_pickup_entrypoint.sh)
  → scripts/anu_pickup_entrypoint.sh ("python3 -m dispatch.anu_pickup_driver")
  → dispatch.anu_pickup_driver.main (L1623)
  → scan_once (L1487)  ← 호출자 12
  → process_one (L933) ← 호출자 6
```
- 전체 게이팅: `is_activated`(`memory/state/p0b_driver_enabled == "enabled"`) 부재 시 **driver 전면 no-op**(L364). 현재 flag **OFF**.

## 3. ★ 단절 지점 (핵심)
- **`scan_live_inbox_once` 호출자 = 0건.** driver.main은 **scan_once만** 호출하고 scan_live_inbox_once는 부르지 않음.
- 즉 move-first/live-inbox 코드는 main에 **존재하나 운영 진입점(main)에 미연결** = WIRED=none. (PR #243 = code-only 정확)
- systemd `.path`도 여전히 legacy `p0b_inbox` PathExistsGlob (live inbox 아님).
- → 단절 = **driver.main → scan_live_inbox_once 호출 경로 부재** (+ systemd .path 경로 미전환, 단 systemd는 별도 축).

## 4. wiring 후보
### (A) ★권장 — driver.main에 event-strategy flag 분기 (최소 연결)
- driver.main에서, **별도 flag `p0b_event_strategy_enabled`(default OFF)** ON 시에만 `scan_live_inbox_once`(live inbox) 호출하는 분기 추가. flag OFF면 **기존 scan_once 경로 그대로**(현행 무변경).
- 호출 주체: driver.main / 입력: live inbox dir, ledger path, owner_gate_fn / 출력: DriverRecord 리스트(기존 scan_once와 동일 contract) / 실패 처리: LIVE_PENDING_MOVE·PENDING_BUSY·PENDING_OWNER(기존 move-first) / callback·result contract 영향: **없음**(scan_live_inbox_once는 기존 collector_result/owner_proof contract 재사용, 신규 contract 0).
- 2중 게이팅: `is_activated`(p0b_driver_enabled) + `p0b_event_strategy_enabled` 둘 다 필요 → 둘 중 하나라도 OFF면 no-op.

### (B) 대안 — 별도 subcommand/entrypoint (`--event-strategy`)
- driver에 subcommand 추가, scan_live_inbox_once만 호출. systemd 미변경. 장점: scan_once 무접촉. 단점: entrypoint 분기/운영 경로 이원화.

### (C) 비권장 — scan_once 내부 통합
- scan_once(호출자 12)에 live inbox scan 병합 → 회귀 표면 큼. 비권장.

→ 권장 = **(A)** (최소 표면, contract 무변경, flag 2중 OFF).

## 5. ACTIVE=false 유지 방식
- wiring = **코드 연결만**, activation 아님. `p0b_event_strategy_enabled` default **OFF** + `p0b_driver_enabled` **OFF** → real pickup/fire/move **0**.
- flag OFF 상태에서 **dry-run/test-only 검증 가능**: scan_live_inbox_once를 fixture/isolated root에서 직접 호출(이미 PR #243의 16 tests 패턴). real inbox/canonical 무접촉.
- real pickup/canary/production path 미접촉: systemd 미변경 · 실 cron fire 0 · flag OFF.

## 6. dry-run 검증 계획
- **isolated root + fixture**(tmp dir)에서 scan_live_inbox_once 호출. real `memory/events/` 무영향.
- 검증: flag OFF → driver.main이 scan_live_inbox_once 호출 안 함(기존 scan_once 경로) / flag ON(fixture) → scan_live_inbox_once 1회 호출, move-first 불변식 동작.
- expected evidence: flag OFF 시 live scan 0회 · flag ON(fixture) 시 신규 result 1개 감지·1회 처리·LIVE_PENDING_MOVE 동작·dedupe 0.
- 성공 판정: flag 2중 OFF에서 real 부작용 0 + fixture에서 분기 동작 확인. 실패 판정: flag OFF인데 live scan 호출됨 / contract 변경 발생.
- rollback/stop: expected_files 밖 수정 필요 → STOP / activation·canary·systemd·admin scope 필요 → STOP / callback·result contract 변경 필요 → STOP / ledger robustness·matching 축으로 번짐 → STOP.

## 7. expected_files 후보 (구현 시 — 이번 packet은 설계만)
- `dispatch/anu_pickup_driver.py` (main flag 분기 + p0b_event_strategy_enabled flag reader)
- `tests/regression/test_p0b_event_strategy_wiring_2761.py` (신규, flag OFF/ON 분기 dry-run)
- 신규 파일 필요: test 1개만. forbidden path 0(systemd .path/.service·matrix·v2_13_gate 제외).

## 8. capability matrix 반영 후보
- `p0b_event_strategy_move_first`: **CODE_MERGED → WIRED_CANDIDATE** 전이 조건 = driver.main에 scan_live_inbox_once 호출 분기 결선(flag 2중 OFF) + dry-run test PASS.
- **WIRED ≠ ACTIVE**: WIRED_CANDIDATE = 코드 연결됨(flag로 toggle 가능, OFF) / ACTIVE = flag ON + real 실행(별도 승인, 미해당).

## 9. 보고 핵심
- **wiring 가능 여부: 가능**(단절 = driver.main → scan_live_inbox_once 호출 부재, 명확)
- **권장 wiring 후보: (A)** driver.main flag 분기(default OFF, contract 무변경)
- **expected_files 후보: 2파일**(driver + 신규 test)
- **dry-run 검증 가능: 가능**(isolated root/fixture, flag OFF에서 real 부작용 0)
- **위험/stop: expected_files 밖 / activation·canary·systemd·admin / contract 변경 / ledger·matching 축 번짐 → STOP_REPORT**
- **WIRED_CANDIDATE 다음 승인안**: (A) 구현 PR 1개(좁은 단일, flag 2중 OFF, systemd 미변경, ACTIVE=false) → dry-run test PASS → matrix WIRED_CANDIDATE. canary는 그 이후 별도.
- **ACTIVE=false 유지**: ✅ (flag 2중 OFF, real 실행 0)

## 10. 안전
코드 수정 0(read-only 분석) · PR/push/merge/canary/systemd/admin 0 · canonical main 206b3ecd 무변경 · flag OFF · **ACTIVE=false**. ledger robustness/matching 축 미접촉.
