# task-2774+3 — live-path governor injection 코드 결선 (단계1, default OFF, guard-native)

## 목표 (회장 단계1 승인 — B 실행 아님)
merge된 governor(feea9dce)를 **실제 driver live 경로**에 연결한다: `dispatch/anu_pickup_driver.py` 의
process_one/scan_once/main 에 `spawn_governor_fn` 을 threading 하여 pickup_once 까지 전달 가능하게 한다.
★ **default None · activation flag OFF/부재 시 builder None 반환 → flag OFF 에서 기존 동작 100% 보존**. activation/canary/systemd 실행 0.
상태명: `TASK2774_LIVEPATH_GOVERNOR_INJECTION_WIRING_DEFAULT_OFF_ACTIVE_FALSE`.

## ★ base (회장 명시 — 강제 pull 금지)
```text
base = origin/main = feea9dce1f0119ca959129ff9d195c972e9081a0 (governor merge본).
로컬 main(177792e5)은 stale — 강제 pull 금지. git fetch origin main 후 origin/main(feea9dce) 기준
guard-native worktree/branch 에서 작업. base 를 먼저 확정(merge-base == feea9dce)하고 시작.
```

## 수정 허용 파일 (정확히 2개 = expected_files)
```text
dispatch/anu_pickup_driver.py                              # process_one/scan_once/main 에 spawn_governor_fn threading + activation-gated builder
tests/regression/test_driver_governor_wiring_2774p3.py     # 신규 테스트 (real activation 0)
```
※ `dispatch/anu_result_pickup_runner.py`(pickup_once) **재작성 절대 금지**(이미 merge됨, spawn_governor_fn 파라미터 존재). 이 task 는 driver→pickup_once 전달 결선만.

## 구현 지시 (owner_gate_fn 패턴 미러 — 최소·정확)
1. **process_one**: 시그니처에 `spawn_governor_fn=None` 추가. 내부 `pickup_fn(... callback_launch_fn=, owner_gate_fn=)` 호출에 `spawn_governor_fn=spawn_governor_fn` **추가 전달**(owner_gate_fn 바로 옆).
2. **scan_once**: 시그니처에 `spawn_governor_fn=None` 추가. process_one 호출(들)에 `spawn_governor_fn=spawn_governor_fn` 그대로 전달.
3. **main**: **activation-gated builder** 추가 — flag 부재/OFF 면 반드시 **None 반환**(기존 동작 보존):
   ```python
   def _build_governor_fn():
       # activation flag gate: 미활성(flag 부재/OFF) → None (현행 100% 보존)
       if not is_activated():          # 기존 driver 의 is_activated() 재사용(ACTIVATION_ENABLED)
           return None
       from utils.spawn_safety_governor import evaluate_spawn   # 최소 import(lazy)
       def _gov(candidate):
           return evaluate_spawn(candidate)   # canonical 기본 경로(governor DEFAULT) 사용
       return _gov
   spawn_governor_fn = _build_governor_fn()
   # ... scan_once(..., spawn_governor_fn=spawn_governor_fn)
   ```
   - ★ is_activated() 가 이미 flag(`p0b_driver_enabled`) 게이트 = flag 부재 → None → governor 미주입 → 기존 동작 보존. 이 PR 은 flag 를 켜지 않는다(activation 0).
   - evaluate_spawn 호출 인자(counters/ledger/decisions/circuit) 는 governor DEFAULT 상수 사용. governor 가 default 인자 미제공 시 동작하면 그대로, 명시 필요 시 canonical `memory/state/` 경로 바인딩(단 이 PR 에서 실행 0이라 경로 정확성은 B canary 에서 검증).
4. governor 가 BLOCK/QUEUE/TRIP 반환 시 pickup_once 가 이미 fail-closed 차단(callback_launch_fn 미호출) — **기존 pickup_once 동작 깨지 말 것**. driver 는 전달만.
5. import 최소 추가만(lazy import 권장). 기존 owner_gate_fn/callback_launch_fn threading 무손상.

## 필수 테스트 (회장 명시 — real activation 0)
```text
1. flag 부재 → _build_governor_fn() == None (builder flag 부재 시 None 반환).
2. flag 부재 → main 경로 spawn_governor_fn=None 으로 scan_once/process_one 전달, 기존 동작 보존.
3. process_one(spawn_governor_fn=stub) → 주입한 stub 이 pickup_fn 호출 인자로 실제 전달됨(spy pickup_fn 으로 확인).
4. scan_once(spawn_governor_fn=stub) → process_one 으로 실제 전달됨.
5. governor stub 이 BLOCK 반환 → pickup_once(실/모의) 경로에서 callback_launch_fn 호출 0.
6. governor stub 이 ALLOW 반환 → 기존 체인 1회만 진행(0회/2회 아님).
7. 기존 owner-proof / callback_launch / dedup 회귀 테스트 PASS(test_anu_pickup_driver* / test_anu_result_pickup_runner_2720 등).
+ real activation(flag 생성/systemd) 없이 전부 테스트 가능해야 함(stub 주입으로).
+ py_compile PASS.
```

## 진행 방식 (guard-native)
```text
1. git fetch origin main → origin/main(feea9dce) 확정. 강제 pull 금지.
2. start_task_guard 정규 경로(lock 자동). feea9dce 기준 worktree/branch attach.
3. 위 2파일만 수정. git diff 변경 == 정확히 2파일. 2파일 밖 → STOP_REPORT.
4. 테스트 PASS 후 push → PR 생성(base main). hook 우회/--no-verify 금지.
5. PR 생성 후 diff 목록 1회 + PR 번호 1회 확인 후 report. CI/Gemini polling 루프 금지(ANU 독립검증).
6. ★ PR 생성까지만. merge 금지(CI/Gemini/final gate 전).
```

## 금지
```text
강제 pull(local main) · hook import 결함 수정 · 기존 pickup_once(anu_result_pickup_runner) 재작성 ·
activation flag 생성/ON · systemd start/enable · canary 실행 · matrix true 전환 ·
expected_files 2개 밖 수정 · replacement_pr_runner.py 수정 · dispatch.py/finish-task.sh 수정 ·
자동 merge · flag OFF 에서 governor 상시 주입(builder None 반환 위반) · 새 기능 축 확장.
```

## STOP 조건 (하나라도 → STOP_REPORT)
```text
2파일 밖 수정 필요 · pickup_once 재작성 필요 · base 가 feea9dce 아님(stale 강제 pull 필요) ·
기존 회귀(owner/callback/dedup) 깨짐 · builder 가 flag 부재 시 None 아님 · activation/systemd/canary 축 번짐 · 자동 merge 시도.
```

## 검증 (완료 전 필수)
```text
pytest tests/regression/test_driver_governor_wiring_2774p3.py + 기존 driver/pickup 회귀 PASS
+ py_compile dispatch/anu_pickup_driver.py PASS
+ flag 부재 시 builder None / 기존 동작 보존 실증
+ stub 주입 → process_one·scan_once 전달 실증 · BLOCK→callback 0 · ALLOW→체인 1회
```

## 보고 (ANU callback envelope + report)
```text
구현 diff(2파일) · 기존 동작 보존 증거(flag 부재→None·회귀 PASS) · spawn_governor_fn 전달 테스트 결과 ·
governor BLOCK 시 callback_launch 0 증거 · ALLOW 시 기존 체인 1회 통과 증거 · base=feea9dce · PR 번호 · merge 미승인.
※ ANU 가 독립검증 후 B 설계로 넘어갈지 판정. CI/Gemini 최종은 ANU 수행.
```

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "dispatch/anu_pickup_driver.py"
    - "tests/regression/test_driver_governor_wiring_2774p3.py"
  forbidden_paths:
    - "dispatch.py"
    - "dispatch/anu_result_pickup_runner.py"
    - "scripts/finish-task.sh"
    - "memory/state/automation_capability_matrix.json"
    - "memory/state/p0b_driver_enabled"
    - "utils/replacement_pr_runner.py"
    - ".claude/**"
    - ".env*"
  commands:
    - "git"
    - "pytest"
    - "python3"
    - "gh"
  merge_policy: "manual"
  ttl_hours: 12
```