# task-2776 — live_inbox evidence wiring (main runtime 경로 LIVE_* verdict 영속, ACTIVE=false)

상태명: `TASK2776_LIVE_INBOX_EVIDENCE_WIRING_DELEGATION_APPROVED_ACTIVE_FALSE`
담당: dev2-team (anu_pickup_driver.py 연속성 — task-2775 체인 동일 파일)
회장 승인: 2026-06-27 — **bounded code implementation 1건 (goal-enabling correction).**

## 레벨
코드+테스트 (Lv.2). merge_policy=manual.

## 배경 (Phase 1 retry에서 발견된 gap)
Phase 1 retry(LIVE_PENDING_OWNER_PROOF 목표)가 **행동상으로는 owner-proof 차단층에 도달**했으나(fixture가
live_inbox 잔존·move 0·fire 0·callback 0), **verdict 라벨이 driver_runs.jsonl 에 영속되지 않아 OBSERVED 로 닫지
못함**. 근본 원인 = `scan_live_inbox_once` 의 `write_evidence=False`(기본값)를 main 의 event_strategy/live_inbox
호출부가 넘기지 않음 → actual main runtime 경로에서 LIVE_* verdict evidence 0.

## 핵심 문제 (코드 위치 — ANU 감사 확정)
- `dispatch/anu_pickup_driver.py:2012` 근처: `def scan_live_inbox_once(... write_evidence: bool = False, ...)`.
- `dispatch/anu_pickup_driver.py:2354-2359`: main 의 event_strategy 분기
  `if is_activated(...) and read_event_strategy_enabled(...): records = scan_live_inbox_once(CANONICAL_ROOT,
  owner_gate_fn=..., callback_launch_fn=...)` — **write_evidence 미전달 → False → _emit 이 _append_evidence 안 함**.
- 대조: else 분기 `scan_once(...)` 는 `write_evidence=True`(driver:1880 기본)라 driver_runs 에 영속됨.
- 그래서 retry 본 실행 후 driver_runs 줄 수 불변(4→4), post-run 재평가(scan_once 경로)만 NOOP_DISABLED 1줄(4→5).

## 목표
main 의 event_strategy/live_inbox 경로에서 `LIVE_PENDING_OWNER_PROOF` 등 LIVE_* verdict
(LIVE_PROCESSED·LIVE_PENDING_BUSY·LIVE_SKIP_DEDUPE·LIVE_PENDING_MOVE 포함)가 **driver_runs.jsonl(또는 동등 runtime
evidence)에 영속**되도록 **최소 wiring** 구현.

## 구현 방향
- **1순위**: main event_strategy 분기(driver:2355)에서 `scan_live_inbox_once(..., write_evidence=True)` **명시 전달**.
  - scan_once 경로(write_evidence=True)와 **대칭**이 되어 일관. `_emit` 이 `_append_evidence(rec, root, evidence_path)`
    로 EVIDENCE_JSONL_REL(driver_runs.jsonl)에 append.
- 이 방식이 **중복 evidence/부작용**을 만들면(예: report_records 와 이중 기록), dev 가 최소 대안 제시 — 단 **actual
  main runtime 경로에서 LIVE_* verdict 가 evidence 로 영속**되어야 한다.
- ★ **report_records 는 reporter_outbox(보고용)** 이고 `_append_evidence` 는 driver_runs(증거)라 별도 파일 — 중복
  아님을 dev 가 **명시 검증**(테스트로). main live scan 1회에 LIVE_* evidence 가 **정확히 1줄만** append 되어야.

## expected_files (엄수 — 외 변경 0)
- `dispatch/anu_pickup_driver.py`
- 테스트 1개: **신규 `tests/regression/test_live_inbox_evidence_wiring_2776.py`** (권장) 또는 2775 파일 추가
- (선택) `memory/reports/task-2776.md` 보고서

## 필수 테스트
1. **main-path LIVE_PENDING 영속** (★핵심): event_strategy ON + live_inbox fixture + head_sha mismatch(canonical 불일치)
   → **main(limited_runtime=True) 또는 module entry 에 가까운 경로를 격리 root 로** 태워서:
   - driver_runs 에 `LIVE_PENDING_OWNER_PROOF` **evidence persisted** 확인
   - callback 호출 0 · REAL_FIRED 0 · fixture move 0(pending 유지)
   - **canonical write 0**(격리 root 만 사용, 실제 memory/state·events 미접촉)
   - ★ **함수 직접 호출만으로 통과하는 테스트는 불충분** — main runtime 경로 격리 검증 필수.
2. **event_strategy OFF regression**: 기존 scan_once/process_one 경로 변화 0, schema_fail/quarantine 계열 기존 동작 영향 0.
3. **callback flag OFF safety**: callback_launch_enabled absent → callback 호출 0 · real fire 0 · cron 0.
4. **duplicate evidence 방지**: main live scan 1회에 LIVE_* evidence **중복 append 0**(정확히 1줄).
5. **ACTIVE=false default / disabled NOOP**: driver disabled 상태에서 기존처럼 NOOP, live_inbox evidence wiring 이
   disabled 상태에서 임의 실행되지 않음.

## 필수 회귀 (전부 PASS)
- `tests/regression/test_limited_activation_bounds_2775.py` (limited activation bounds)
- 2760 관련 regression (`test_p0b_event_strategy*2760*.py`)
- 2721 driver 인접 regression (`test_anu_pickup_driver_2721.py`)
- 신규 2776 regression
- `py_compile` PASS · expected_files 밖 수정 0.

## 금지
production activation / Phase 1 retry 재실행 / fixture 생성 / flag ON / event_strategy ON(실제 canonical) /
callback_launch_enabled 생성 / real fire / systemd start·enable / recurring 등록 / canary / backlog consumption /
p0b_inbox archive 28건 이동 / pending fixture quarantine 이동 / key rotation 자동 / **merge**.

## STOP 조건 (하나라도면 즉시 STOP 보고)
expected_files 밖 수정 필요 / real fire 필요 / activation 필요 / systemd 필요 / flag ON 필요 / canonical
inbox·live_inbox 실제 조작 필요 / archive 28건·pending fixture quarantine 이동 필요 / raw key·secret 노출 /
existing callback·owner-proof contract 변경 / LIVE_PROCESSED 를 목표로 scope 변경 / event_strategy OFF 경로 회귀 /
duplicate evidence 발생 / Gemini HIGH·Critical / blocking Medium.

## bounded fix doctrine
HIGH/Critical=0 · medium=2(초과 시 OWNER_DECISION) · style-only MEDIUM = non-blocking 분리(미세패치 loop 금지).
같은 axis 반복 결함 시 미세패치 중단 → 구조 분리 보고.

## PR 게이트 (merge candidate 판정 기준 — merge 는 ANU/회장)
expected_files 외 변경 0 · targeted regression PASS · 2775/2760/2721 PASS · CI green · fresh Gemini review
HIGH 0/Critical 0/blocking Medium 0 · ACTIVE=false 유지 · real fire 0 · systemd inactive·disabled 유지 · flags OFF 유지.

## 완료 처리 + ANU callback (필수)
- 완료 시 `memory/events/task-2776.done` + `memory/reports/task-2776.md`.
- 봇 idle 전 **ANU callback 필수**(성공/실패/blocked 무관). collector=ANU, owner_key=`<ANU_OWNER_KEY_FROM_SEALED_LOADER>`,
  self-key 금지. callback prompt UTF-8 **≤3900 bytes**, envelope 만(task_id·PR#·head sha·result_path·report_path·one-line).
  **merge 절대 금지.** PASS 나와도 머지 금지 — ANU 독립검증 → fresh Gemini → CI → MERGE_CANDIDATE 보고로만.

## 진행
dev2 는 1순위(write_evidence=True 명시 전달) 구현 + main-path regression(LIVE_PENDING_OWNER_PROOF evidence persisted,
canonical write 0) + 회귀(2775/2760/2721) 후 branch push → **PR 생성**(merge 금지) → 보고서 + .done + ANU callback.
ANU 가 이후 독립검증/Gemini/CI/merge candidate 판단.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "dispatch/anu_pickup_driver.py"
    - "tests/regression/test_live_inbox_evidence_wiring_2776.py"
    - "tests/regression/test_limited_activation_bounds_2775.py"
    - "memory/reports/task-2776.md"
    - "memory/events/task-2776.done"
  forbidden_paths:
    - ".github/**"
    - "scripts/finish-task.sh"
    - "utils/spawn_safety_governor.py"
    - "dispatch/anu_callback_launch_audit.py"
    - "dispatch/anu_activation_preflight.py"
    - "memory/state/p0b_driver_enabled"
    - "memory/state/p0b_event_strategy_enabled"
    - "memory/state/p0b_callback_launch_enabled"
    - "memory/events/p0b_inbox/**"
    - "memory/events/p0b_live_inbox/**"
    - "memory/reports/p0b_inbox_backlog_archive_260627/**"
    - "memory/reports/limited_pilot_phase1_retry_phase1retry260627/**"
  commands: ["pytest", "python3 -m py_compile", "git", "gh"]
  merge_policy: "manual"
  ttl_hours: 24
```
