---
scope: task
task_id: task-2774+3
title: PR #251 ANU 독립검증 결과 — live-path governor injection (단계1, default OFF)
state: TASK2774P3_PR251_INDEPENDENT_VERIFICATION_DONE_NOT_MERGE_READY_GEMINI_HIGH_OPEN_ACTIVE_FALSE
date: 2026-06-24
verifier: Odin (dev2)
---

# PR #251 독립검증 — 결론: NOT merge-ready (Gemini HIGH 1건 미해소)

## Situation
회장 판정 `TASK2774P3_PR251_INDEPENDENT_VERIFICATION_REQUIRED_ACTIVE_FALSE`.
구현은 수용 후보, 단 merge-ready 확정 전 독립검증 필수.

## Complication
gemini-review-gate 체크는 PASS(녹색)지만 inline thread 전수확인 결과 **unresolved=3
(HIGH 1 + MEDIUM 2)**. 게이트 PASS만으로 HIGH 0 단정 불가(QC-RULES 직접확인 규칙 적중).

## Question
PR #251을 merge-ready candidate로 올릴 수 있는가?

## Answer: 아니오 (NOT merge-ready). Blocker = Gemini HIGH 1건.

---

## 1. Git 불변식 — ALL PASS
- PR #251 head = `c31d8e7f` (GitHub == local worktree 일치)
- base origin/main = `feea9dce` (PR#250 governor 머지본). `feea9dce`는 head의 조상 → base가 feea9dce 이후 ✓
- effective diff vs feea9dce = **정확히 2파일** (순수 추가, 0 삭제):
  - `dispatch/anu_pickup_driver.py` (+26)
  - `tests/regression/test_driver_governor_wiring_2774p3.py` (+417)
- `anu_result_pickup_runner.py` / `pickup_once` 변경 = **0** ✓
- activation flag 생성 0 · systemd/canary/real callback/real spawn 0 · matrix true 0 · local main 강제 pull 0 ✓
- driver diff 내용: process_one/scan_once에 `spawn_governor_fn=None` 파라미터 추가 + 전달,
  `_build_governor_fn`은 `is_activated` 부재/OFF 시 None 반환(현행 보존). flag 변경 0.

## 2. 테스트 재현
- py_compile PASS
- 신규 7/7 PASS (회장 12개 거동 기준 전부 커버):
  - `test_builder_none_when_flag_absent` → _build_governor_fn(flag 부재)→None
  - `test_builder_callable_when_enabled` → flag enabled stub→callable
  - `test_process_one_threads_governor_to_pickup` / `test_scan_once_threads_governor` → 전달 결선
  - `test_block_decision_blocks_callback` → BLOCK 주입 시 callback_launch_fn 호출 0
  - `test_allow_decision_proceeds_once` → ALLOW 주입 시 owner_gate 1회 도달
  - `test_default_path_governor_none_preserves` → scan_live_inbox_once 무손상
- governor 직접 회귀 53 PASS (driver 34 + wiring 7 + spawn_safety_governor 12)
- **전체 regression: 2456 passed / 12 failed / 11 skipped**
  - 12 failed = **전부 선행/환경결합, 0건이 내 변경 기인** (증거 아래)

### 12 failed 분리 증거
- driver 직접 관련 2종(`test_anu_pickup_p0b_audit_decision_check::test_main_exit_zero`,
  `test_sealed_key_and_launcher_wiring_2729p13::test_07_dedupe_process_one_pickup_skip`)을
  **base feea9dce(내 변경 직전)에서 동일하게 실행 → 2 failed 동일** → PR#250 상속 선행 실패.
- 나머지 10종 = finish-task.sh 라인넘버 guard / HOME hardcode / worktree 경로명(`wt-2729p9`)
  하드코딩 기대 = 환경결합. 내 diff는 .sh 무손상(2파일만, additive) → 구조적으로 영향 불가.
- `test_base_source_isolation_2729p9.py` 1건은 수집단계 worktree 경로명 assert로 collection error
  (deselect 처리). 환경결합.

## 3. GitHub final gates (1-shot)
- CI: **11/11 PASS** (cancel-kill-switch, ci/guard, gemini-review-gate, guard,
  hidden-path-audit, lock-in-check, merge-safety-check, phase3-merge-gate, qc-check,
  taskctl-state-guard ×2)
- mergeable = **MERGEABLE**, mergeState = BLOCKED(승인 리뷰 부재 → merge 금지라 정상)
- **Gemini unresolved = 3 (resolved==false 전수, outdated 무관)**:
  1. **HIGH** `dispatch/anu_pickup_driver.py:1900` — `is_activated()` 호출이 OSError 등 예외 시
     main() 크래시 위험 → "flag 부재 시 100% 보존" 불변식 위반. 권장: try/except로 감싸 예외 시
     None 반환(fail-closed to governor-not-injected). **정당한 지적**(governor r1 fail-open→
     fail-closed 계열과 동일).
  2. MEDIUM `test_...:291` — tmp_path/Path.write_text 권장(tempfile.mkdtemp 대체). 스타일.
  3. MEDIUM `test_...:347` — 동일 스타일 권장.

## 4. scope-gate false positive — 확정
- stale local main(`177792e5`) 기준 diff = **5파일** (내 2 + PR#250 governor 3)
- 정확한 base(`feea9dce`) 기준 diff = **2파일**
- 차집합 3파일 = `anu_result_pickup_runner.py`, `test_spawn_safety_governor_2774.py`,
  `utils/spawn_safety_governor.py` = **전부 PR#250 governor 머지본 기존 파일**(내 변경 아님)
- finish-task 최종 per-task scope-diff = 2파일, `.done` status=done, `.scope-guard-done` 생성
- → finish-task 1차 비-STRICT scope-gate가 stale local main 기준 diff로 governor 3파일을
  오탐. **scope-gate false positive로 분리 확정.**

## 5. ACTIVE=false 유지 증거
- flag 생성/변경 0, systemd start/enable 0, canary 0, real callback/spawn 0, matrix true 0
- L1 런타임: `_build_governor_fn()` → None (default OFF 불변식 실증)

---

## 최종 판정
| 항목 | 결과 |
|---|---|
| 구현 정합성 | ✅ 수용 후보 (2파일, additive, 결선만) |
| Git 불변식 | ✅ ALL PASS |
| 테스트 재현 | ✅ 신규 7/7 + governor 회귀 53 PASS, 12 failed 전부 선행/환경(0 기인) |
| CI | ✅ 11/11 PASS |
| mergeable | ✅ MERGEABLE |
| **Gemini unresolved** | ❌ **3 (HIGH 1 + MEDIUM 2)** |
| scope-gate false positive | ✅ 확정 분리 |
| ACTIVE=false | ✅ 유지 |

**merge-ready: NO.** 차단 사유 = Gemini HIGH 1건(is_activated 예외 → 불변식 위반).
회장 기준 "unresolved 0과 final gates PASS 전까지 merge 금지" → **merge 안 함.**

## OWNER_DECISION_REQUIRED (bounded fix budget — HIGH=0 required)
HIGH 해소는 4줄 방어적 try/except 1 remediation round. 현 지시 "추가 코드 수정 금지" 하에
회장 결정 대기:
- **A) 승인** — 1 remediation round 위임(토르, guard-native PR, HIGH try/except + MEDIUM 2 tmp_path 동시).
- **B) 위임** — watcher/팀원에게 수렴 위임.
- **C) close** — PR 보류/폐기.
- **D) dismiss** — HIGH를 근거와 함께 기각(비권장: 불변식 직격 지적이라 dismiss 부적합).

권고: **A**. HIGH가 PR 자체의 핵심 주장(100% 보존)을 강화하는 방향이고 4줄·저위험.
