# task-2774+4 — PR#251 remediation round1 (Gemini HIGH1+MED2, guard-native)

## 목표 (회장 1 remediation round 승인)
PR #251(head c31d8e7f)의 **Gemini unresolved 3건(HIGH 1 + MED 2)** 을 닫아 merge-ready 로 만든다.
★ default OFF 보존·예외 시 None 반환 강화. activation/canary/systemd 0.
상태명: `TASK2774P3_PR251_REMEDIATION_ROUND1_APPROVED_ACTIVE_FALSE`.

## base (강제 pull 금지)
```text
PR #251 위에 remediation commit 추가. branch task/task-2774+3-dev2 (head c31d8e7f, base feea9dce 이후).
로컬 main(177792e5) stale — 강제 pull 금지. fetch + 기존 branch worktree 재사용.
```

## 수정 범위 (정확히 2파일 = PR#251 기존 2파일 안에서만)
```text
dispatch/anu_pickup_driver.py
tests/regression/test_driver_governor_wiring_2774p3.py
```

## HIGH 1 처리 (Gemini driver:1900)
```text
_build_governor_fn 의 is_activated 호출부를 try/except 로 감싼다:
  - is_activated(또는 flag_reader) 예외(OSError 등) 발생 시에도 main 이 죽지 않게 → 반드시 None 반환.
  - flag OFF / 부재 / 오류 = 전부 governor 미주입(None) = 기존 동작 100% 보존.
권장 형태:
    try:
        if not is_activated(root, flag_reader=flag_reader):
            return None
    except Exception:
        return None
※ 예외를 삼켜 None 반환은 "governor 미주입"이라 안전(차단 안전장치를 끄는 게 아니라, activation 안 된 상태로 보존).
```

## MED 2 처리 (Gemini test:291/347)
```text
신규 테스트 2곳의 result.json 작성을 tempfile.mkdtemp+os.path.join → pytest tmp_path / Path.write_text 스타일로 개선.
★ 동작/검증 의미 변경 금지(payload·assert 동일). 순수 스타일만.
```

## 필수 테스트 (회장 명시)
```text
1. flag 부재 → _build_governor_fn() == None
2. is_activated 또는 flag_reader 예외 → _build_governor_fn() == None (신규: 예외 주입 케이스 추가)
3. flag enabled('enabled') → callable 반환
4. process_one → pickup_once 로 spawn_governor_fn 전달
5. scan_once → process_one → pickup_once 전달
6. BLOCK governor 주입 시 callback_launch_fn 호출 0
7. ALLOW governor 주입 시 owner_gate 1회 도달
8. 신규 7종(+예외 케이스) 테스트 PASS
9. 기존 핵심 회귀 PASS (test_anu_pickup_driver* / test_anu_result_pickup_runner_2720 / test_spawn_safety_governor_2774)
10. py_compile PASS
```

## 진행 방식 (guard-native, PR #251 위 commit 추가)
```text
1. fetch origin → branch task/task-2774+3-dev2 (c31d8e7f) worktree attach. 강제 pull 금지.
2. 위 2파일만 수정. git diff (c31d8e7f..HEAD) == 정확히 2파일. 2파일 밖 → STOP_REPORT.
3. 테스트 PASS 후 push → PR #251 자동 업데이트. hook 우회/--no-verify 금지.
4. Gemini HIGH/MED thread 는 코드 fix push 로 해소(임의 resolve 금지).
5. push 후 diff 목록 1회 + PR 상태 1회 확인 후 report. CI/Gemini polling 루프 금지(ANU 독립검증).
6. ★ merge 금지(CI/Gemini/final gate 전).
```

## 금지
```text
activation flag 생성/ON · systemd start/enable · canary · real callback 발사 · matrix true 전환 ·
pickup_once/anu_result_pickup_runner.py 수정 · hook import 결함 수정 · replacement_pr_runner.py 수정 ·
자동 merge · expected_files 2파일 밖 수정 · 새 기능 축 확장 · MED 처리하며 동작 변경.
```

## STOP 조건 (하나라도 → STOP_REPORT)
```text
2파일 밖 수정 필요 · pickup_once 수정 필요 · 기존 7종/핵심 회귀 깨짐 ·
예외 처리가 builder None 반환 위반(예외 삼키지 못함) · activation/systemd/canary 축 번짐 · 자동 merge 시도.
```

## 검증 (완료 전 필수)
```text
pytest tests/regression/test_driver_governor_wiring_2774p3.py (신규 7+예외) PASS
+ 핵심 회귀(anu_pickup_driver*/anu_result_pickup_runner_2720/spawn_safety_governor_2774) PASS
+ py_compile dispatch/anu_pickup_driver.py PASS
+ is_activated 예외 주입 → builder None 실증
```

## 보고 (ANU callback envelope + report)
```text
remediation commit sha · HIGH/MED 처리 내역 · 예외 시 None 반환 증거 · 테스트 결과(신규+회귀) ·
2파일 밖 수정 0 · CI/Gemini 상태 · ACTIVE=false 유지 · merge-ready 여부.
※ ANU 가 독립검증으로 default OFF 보존·예외 시 None 재현. unresolved 0 전까지 merge 금지.
```

## 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
```