# task-2774+6 — PR#252 remediation round1 (G3 fail-open 방지, guard-native)

## 목표 (회장 승인 — polish 아님, G3 안전 게이트 fail-open 차단)
PR #252(head 8159dba5)의 **Gemini MED 3건** 중 **2·3번이 G3 backlog 보호 게이트의 fail-open 가능성**이라 닫는다.
★ glob 패턴 오인·상대경로 CWD 오해석으로 **backlog를 못 잡으면 안전 게이트가 조용히 실패(fail-open)** → C 선행 PR 목적과 충돌. fail-closed로 고친다.
상태명: `TASK2774_PR252_REMEDIATION_ROUND1_G3_FAILOPEN_FIX_GUARD_NATIVE_ACTIVE_FALSE`.

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

## 수정 범위 (정확히 2파일 = PR#252 expected_files 안, driver 무접촉 원칙)
```text
dispatch/anu_activation_preflight.py                           # G3 fail-open 3건 수정 (flag read bounded · listdir 기반 · root 기준 정규화)
tests/regression/test_activation_intended_safety_2774p5.py     # G3 fail-open 방지 신규 테스트 추가(기존 11종 유지)
```
★ **driver 파일(`anu_pickup_driver.py`) 건드리지 않는 것 원칙** · pickup_once/replacement_pr_runner/hook import **수정 금지**.
★ expected_files 2개 초과 필요 · driver 수정 불가피 · pickup_once 등 수정 필요 → **STOP_REPORT**.

## 수정 요구 (Gemini MED 3건)
### MED-1 (flag 파일 read — bounded)
```text
activation flag(p0b_driver_enabled) read 시 무제한 readline 금지 → readline(100) 등으로 제한.
손상·거대 flag 파일이 있어도 OOM/비정상 진행 0. (≤100 bytes 읽고 strip 비교)
```
### MED-2 (★ backlog 탐지 — glob 금지, fail-closed)
```text
glob.glob 패턴 기반 backlog 탐지 금지. 경로에 [ ] ? * 같은 metacharacter 있어도 패턴 오인으로 미탐 안 하도록
os.listdir / pathlib.iterdir 기반으로 inbox 디렉토리를 나열·필터(task- prefix + .result.json suffix).
★ backlog 탐지는 fail-OPEN이 아니라 fail-CLOSED: listdir 오류/inbox 접근 불가 등은 안전하게 보수적 처리(미탐 0).
```
### MED-3 (★ 상대경로 — root 기준 정규화, fail-closed)
```text
canary paths의 상대경로는 CWD 기준이 아니라 root 기준으로 해석: os.path.join(root, p) 후 정규화.
비교가 root 기준 absolute canonical path로 일관 동작(realpath/abspath 일관 적용).
root 밖 경로·이상 경로·비교 불가 경로는 안전하게 STOP(fail-closed, 조용한 통과 금지).
```
### 의미 보존 (불변)
```text
- backlog 파일 1건이라도 있고 그 파일이 명시 canary paths에 미포함 → CANONICAL_BACKLOG_DETECTED STOP.
- paths None/빈 목록 → CANARY_PATHS_REQUIRED STOP.
- backlog 삭제/수정/이동/소비 0 (읽기 나열만).
- G2 5개 STOP reason(ACTIVATION_CHECK_ERROR/NOT_ACTIVATED/GOVERNOR_BUILD_ERROR/GOVERNOR_NOT_INJECTED/GOVERNOR_NOT_CALLABLE) 그대로 유지.
```

## 필수 테스트 (회장 명시 — 기존 11종 유지 + 신규)
```text
신규:
1. 매우 긴/손상 flag 파일 → bounded read로 처리(OOM/비정상 진행 0, 정상 판정).
2. inbox 파일명/경로에 glob metacharacter([ ] ? *) 포함돼도 backlog 정확 감지(미탐 0) → CANONICAL_BACKLOG_DETECTED.
3. canary paths 상대경로 → root 기준 정규화됨(CWD 기준 오해석 0).
4. canary path가 root 밖/비교 불가 → STOP(fail-closed).
5. backlog 존재 + canary paths 밖 파일 존재 → CANONICAL_BACKLOG_DETECTED.
6. 명시 canary 1개만 → 그 1개 외 backlog consume 0(개수·내용 불변).
유지(회귀):
7. 실 canonical backlog count/sha 불변 재현.
8. G2 5개 STOP reason 유지.
9. 기존 신규 11종 PASS.
+ 핵심 회귀(driver_governor_wiring_2774p3/anu_pickup_driver_2721/anu_result_pickup_runner_2720/spawn_safety_governor_2774) PASS · py_compile PASS.
```

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

## 금지
```text
서명 위조 · hook import 결함 수정 · 자동 merge · expected_files 2파일 밖 수정 · driver 수정(원칙) ·
pickup_once/replacement_pr_runner 수정 · flag 생성/ON · systemd/canary/real fire · matrix true · 추가 polish성 변경 ·
glob 패턴 잔존(fail-open) · CWD 기준 상대경로 잔존(fail-open).
```

## STOP 조건 (하나라도 → STOP_REPORT)
```text
2파일 밖/driver 수정 필요 · pickup_once 등 수정 필요 · 기존 11종/핵심 회귀 깨짐 ·
G3 fail-open 잔존(glob/CWD) · backlog consume 발생 · base가 8159dba5 아님(stale 강제 pull) · 자동 merge 시도.
```

## 검증 (완료 전 필수)
```text
pytest tests/regression/test_activation_intended_safety_2774p5.py (기존11+신규) PASS
+ 핵심 회귀 PASS + py_compile PASS
+ glob metacharacter 경로 backlog 감지 실증 · 상대경로 root 기준 정규화 실증 · 실 canonical backlog 불변 실증
```

## 보고 (ANU callback envelope + report)
```text
remediation commit sha · 수정한 MED 3건 대응 내역 · root 기준 정규화 증거 · glob→listdir fail-closed 증거 ·
실 canonical backlog 불변 증거 · 테스트 결과(기존11+신규+회귀) · 2파일 밖 수정 0(driver 무접촉) · CI/Gemini 상태 · ACTIVE=false 유지 · merge-ready 여부.
※ ANU 독립검증으로 G3 fail-open 방지 케이스 재현. unresolved 0 + final gate 전 merge 금지.
```

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "dispatch/anu_activation_preflight.py"
    - "tests/regression/test_activation_intended_safety_2774p5.py"
  forbidden_paths:
    - "dispatch.py"
    - "dispatch/anu_pickup_driver.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
```