# task-2774+8 — D-2 fire wiring PR (실발사 가능하게 하는 안전 결선, guard-native)

## 목표 (회장 조건부 승인 — 실발사 PR 아님, 안전 결선 PR)
`attempt_owner_fire`의 production fire_fn 결선 공백 + `ONESHOT_TARGET` 고정 하드코딩을 정식으로 닫아, **D-2 real fire 1-shot이 우회 없이 가능하도록 안전 결선**한다.
★ **이 PR은 real fire를 쏘지 않는다.** 실발사 결선만 만들고, 실제 발사는 PR merge 후 별도 D-2 실행 승인 때만.
상태명: `D2_FIRE_WIRING_PR_CODE_WORK_GUARD_NATIVE_ACTIVE_FALSE`.

## base (강제 pull 금지)
```text
base = origin/main = local main = e4904e2f10c6f1e38610f85a8b3595b252362eec (현재 동기화됨).
dirty 2(memory/specs/anu-system-spec*.md = update-system-spec cron 산출물)는 코드 아님 — 무관·건드리지 말 것.
```

## 수정 허용 파일 (expected_files — 정확히 이 범위, 밖이면 STOP_REPORT)
```text
dispatch/anu_result_pickup_runner.py                      # attempt_owner_fire production fire_fn 명시 결선 + target 인자화
tests/regression/test_d2_fire_wiring_2774p8.py            # 신규 fire wiring fail-closed 테스트
(필요 시) memory/plans/spawn_safety_governor/d2_fire_wiring_design_2774p8.md   # 설계문서 1개
```
★ **owner_proof_pickup_gate / governor / G2 / G3 / D-1 owner-proof·freshness PASS 경로 수정 금지.**
★ `build_callback_launch_fn`(anu_callback_launch_audit.py)은 ACTIVE gate가 이미 함수인자(flag_reader)라 **무수정 원칙**.
★ expected_files 밖 수정 필요·다른 안전층 건드려야 함 → **STOP_REPORT**.

## 구현 쐐기 (회장 verbatim — 하나라도 위반 시 STOP)
```text
1. ★ attempt_owner_fire에 실발사 default fire_fn 넣지 마라. fire_fn 미주입 → 반드시
   FIRE_BLOCKED_NO_FIRE_FN(신규 fail-closed enum) 또는 이에 준하는 fail-closed로 끝난다.
   (default 실발사 함수가 생기면 예상치 못한 경로에서 fire 발생 → 절대 금지)
2. ★ 실발사 fire_fn은 승인된 1-shot 전용 entrypoint(예: run_approved_oneshot_fire(...))에서만
   명시 주입. 이 함수는 ONESHOT 전용 wrapper — 일반 runner/pickup 경로가 자동으로 타면 안 됨.
3. ★ target 인자화 허용하되 '아무 target 허용' 금지. 승인된 target manifest 또는 호출 인자가
   실제 result와 (a)task_id (b)head_sha==런타임 canonical HEAD (c)absolute result path
   3개 모두 정확 일치할 때만 ALLOW. 하나라도 불일치 → FIRE_BLOCKED_NO_APPROVAL.
   (prefix/short SHA 완화 0, len==40 정확 일치 유지)
4. ★ approved_one_shot은 1회 사용 후 소진 또는 dedupe marker(task_id+head_sha)로 2회차 차단.
5. ★ target manifest가 파일이면: 위치·수명·소진 방식·재사용 차단 명확히 구현(승인 manifest 잔존→재발사 구조 금지).
   호출 인자면: audit/log에 raw key/민감정보 0.
6. ★ --once 외 recurring cron 금지. cokacdir --cron --once 1회 형태만.
7. ★ ACTIVE gate(callback_launch flag) = 함수인자·전역 파일 생성 0·D-2 호출 범위 한정.
   p0b_driver_enabled(activation)와 혼동 금지(별개 유지).
8. ★ raw key argv/log/audit 노출 0. sealed loader 런타임 로드만. 예외 reason도 raw-key hygiene(고정 라벨). redacted_argv 별도.
9. canonical p0b_inbox backlog 13건 = 처리 대상 아님(target 외 fire 0).
```

## 필수 테스트 (회장 — mock fire_fn만, 실 cokacdir 호출 절대 금지)
```text
1. fire_fn 미주입 → FIRE_BLOCKED_NO_FIRE_FN (또는 준하는 fail-closed)
2. target 정확 일치 1건만 → mock fire_fn 정확히 1회 호출
3. 동일 target 2회차 → DEDUP/BLOCK, fire_fn 미호출
4. target 미일치(task_id/head_sha/abs path 중 1개라도) → FIRE_BLOCKED_NO_APPROVAL, fire_fn 미호출
5. ACTIVE gate OFF → NOOP_DISABLED, fire_fn 미호출
6. owner-proof gate 미통과 → fire_fn 미호출
7. raw key가 argv/log/audit에 포함되면 테스트 FAIL(노출 0 검증)
8. 전역 flag 파일 생성 0(함수인자 격리 검증)
9. canonical backlog 13건 → 처리 대상 0(target 외 fire 0)
10. target manifest 누락 시 STOP 또는 테스트 FAIL
★ 11. 실제 cokacdir --cron 호출 0 — 테스트는 mock fire_fn으로만. real fire 발사 0.
+ 핵심 회귀: D-1 owner-proof/freshness PASS 경로 무손상 · governor/G2/G3 무손상 ·
  test_spawn_safety_governor_2774 · test_driver_governor_wiring_2774p3 · py_compile PASS.
```

## 진행 방식 (guard-native)
```text
1. base/head/dirty/expected_files 확인. e4904e2f 기준 worktree(start_task_guard 정규·lock 자동).
2. 코드 변경 전 attempt_owner_fire 정확한 위치 + 현재 call graph 재확인.
3. expected_files만 수정. git diff(e4904e2f..HEAD)가 expected_files 안에만 있는지 확인.
4. 테스트 + py_compile 실행 PASS.
5. ★ PR 생성 전 결과 보고(ANU callback). PR 생성/merge/real fire 실행은 별도 승인 전까지 0.
6. scope-guard 오탐 시 escalate로 멈추고 ANU 판단 요청(.done/.scope-guard-done 수동 생성 금지).
```

## 금지
```text
real fire 실행 · 실제 cokacdir --cron 호출(테스트 포함) · 실발사 default fire_fn · approved 조건 완화 ·
expected_files 밖 수정 · owner-proof/governor/G2/G3 수정 · D-1 PASS 경로 변경 · build_callback_launch_fn 수정 ·
raw key 노출 · 전역 flag 파일 생성 · recurring cron · 서명위조 · 우회/permissive stub · 자동 PR/merge · ACTIVE 전환.
```

## STOP 조건 (하나라도 → STOP_REPORT)
```text
expected_files 밖/owner-proof 등 수정 필요 · 실발사 default fire_fn 필요 · approved 조건 완화 필요 ·
raw key 노출 위험 · 테스트/구현 중 실제 real fire 발생 가능성 · D-1 PASS 경로 깨짐 ·
fire 2회 이상 가능성 · backlog 처리 가능성 · base가 e4904e2f 아님.
```

## 보고 (ANU callback envelope)
```text
구현 diff(expected_files 안) · 새 entrypoint(run_approved_oneshot_fire) 책임 · FIRE_BLOCKED_NO_FIRE_FN 결선 ·
target 인자화/manifest lifecycle · approved 3조건 정확일치 · 1회 소진/dedupe · raw key 노출 0 증거 ·
테스트 결과(11종+회귀) · 실 cokacdir 호출 0 · D-1/governor/G2/G3 무손상 · PR 미생성(보고 후 대기).
```

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "dispatch/anu_result_pickup_runner.py"
    - "tests/regression/test_d2_fire_wiring_2774p8.py"
    - "memory/plans/spawn_safety_governor/d2_fire_wiring_design_2774p8.md"
  forbidden_paths:
    - "dispatch/anu_pickup_driver.py"
    - "dispatch/anu_activation_preflight.py"
    - "dispatch/anu_callback_launch_audit.py"
    - "utils/spawn_safety_governor.py"
    - "scripts/finish-task.sh"
    - "memory/state/p0b_driver_enabled"
    - "memory/state/p0b_callback_launch_enabled"
    - "memory/state/p0b_real_wake_enabled"
    - "memory/state/automation_capability_matrix.json"
    - ".claude/**"
    - ".env*"
  commands: ["git", "pytest", "python3"]
  merge_policy: "manual"
  ttl_hours: 12
```