# task-2774+7 — PR#252 remediation round2 (G3 containment HIGH, last small round)

## 목표 (회장 옵션 A — 마지막 small remediation, containment robustness만)
PR #252(head a41c58e8)의 fresh Gemini **새 HIGH 1건**(G3 containment 체크 correctness)을 닫는다.
★ 우리가 +6에서 추가한 root-containment 체크(`root_real + os.sep` startswith)가 root=`/` 등 엣지서 valid sub-path 오판 → `os.path.commonpath` 기반으로 교체. **이번 라운드는 containment robustness 보강만**.
상태명: `TASK2774_PR252_REMEDIATION_ROUND2_G3_CONTAINMENT_HIGH_GUARD_NATIVE_ACTIVE_FALSE`.

## base (강제 pull 금지)
```text
PR #252 위에 remediation commit 추가. branch task/task-2774+5-dev2 (head a41c58e8).
로컬 main(177792e5) stale — 강제 pull 금지. fetch + 기존 branch worktree 재사용.
실제 remediation delta = a41c58e8..HEAD 기준 2파일 이내.
```

## 수정 범위 (정확히 2파일 = 그 외 수정 금지)
```text
dispatch/anu_activation_preflight.py                           # containment 체크 commonpath 교체 (+ BOM MED 동봉 가능)
tests/regression/test_activation_intended_safety_2774p5.py     # containment robustness 신규 테스트 추가(기존 유지)
```
★ **driver(`anu_pickup_driver.py`) 무접촉** · pickup_once/replacement_pr_runner/hook import 수정 금지 · scope-guard/finish-task 수정 금지.
★ 2파일 밖 수정 필요 → **STOP_REPORT**.

## 수정 요구
### HIGH (preflight `_norm_under_root` containment — commonpath 교체)
```text
root-containment 체크를 문자열 startswith(`root_real + os.sep`) → os.path.commonpath 기반으로 교체.
- root=`/`(시스템 루트) 등에서도 valid sub-path를 오판하지 않아야 함(과도 거부 0).
- root 밖 path → 계속 CANARY_PATH_INVALID STOP(fail-closed).
- root 안 path → 정상 READY 또는 기존 로직대로 진행.
- `..` 등으로 realpath 해석 후 root 밖으로 나가면 fail-closed STOP.
권장 형태:
    try:
        if os.path.commonpath([root_real, np]) == root_real:
            return np
    except ValueError:   # 다른 드라이브/비교 불가 등
        pass
    return None
★ realpath/abspath 정규화는 기존 그대로 유지. commonpath 비교만 교체.
```
### MED (BOM — 같은 파일 저비용 동봉 가능, 과장 금지)
```text
flag 파일 read 시 utf-8-sig 또는 BOM strip 으로 'enabled' 비교 안정화.
★ 안전성 보강일 뿐: BOM 때문에 비교 실패해도 기존엔 NOT_ACTIVATED(fail-closed)였음 — 핵심 변경 아님. bounded read(readline(100)) 유지.
```
### evidence-defer (이번 라운드 수정 금지)
```text
- driver:1937 (print→logger) MED: 스타일성 + +5 driver scope → 수정 금지, evidence-defer.
- finish-task scope-guard stacked-PR base 오탐: 별도 인프라 backlog 유지, 이 트랙 수정 금지.
```

## 의미 보존 (불변)
```text
- CANONICAL_BACKLOG_DETECTED / CANARY_PATHS_REQUIRED / CANARY_PATH_INVALID / INBOX_SCAN_ERROR STOP 의미 유지.
- G2 5개 STOP reason 유지. backlog 삭제/수정/이동/소비 0. glob 제거(listdir) 유지. ACTIVE=false 유지.
```

## 필수 테스트 (회장 명시 — 기존 유지 + 신규 containment)
```text
신규:
1. root="/" 에서 root 내부 valid path가 CANARY_PATH_INVALID로 오판되지 않음(commonpath).
2. 일반 root에서 root 내부 relative canary path 정상 정규화 → READY.
3. root 밖 absolute path → CANARY_PATH_INVALID STOP.
4. `..` 등으로 root 밖 탈출하는 path → CANARY_PATH_INVALID STOP(realpath 결과 root 밖이면 STOP).
유지(회귀):
5. glob metacharacter backlog 감지 기존 테스트 유지.
6. root 기준 정규화 기존 테스트 유지.
7. backlog 불변 기존 테스트 유지.
8. G2 5개 STOP reason 유지.
9. 기존 신규(11+5=16종) 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 (a41c58e8) worktree attach. 강제 pull 금지.
2. 위 2파일만 수정. git diff(a41c58e8..HEAD) == 정확히 2파일. driver 변경/2파일 초과 → STOP_REPORT.
3. 테스트 PASS 후 push → PR #252 자동 업데이트. hook 우회/--no-verify 금지.
4. Gemini HIGH thread 는 코드 fix push 로 해소(임의 resolve 금지).
5. push 후 diff 목록 1회 + PR 상태 1회 확인 후 report. CI/Gemini polling 루프 금지(ANU 독립검증).
6. ★ merge 금지. .done/.scope-guard-done 수동 생성 금지(scope-guard 오탐 시 escalate로 멈추고 ANU 판단 요청).
```

## 금지
```text
서명 위조 · hook import 결함 수정 · 자동 merge · expected_files 2파일 밖 수정 · driver 수정 · driver:1937 MED 수정 ·
scope-guard/finish-task 수정 · .done/.scope-guard-done 수동 생성 · pickup_once/replacement_pr_runner 수정 ·
flag 생성/ON · systemd/canary/real fire · matrix true · 추가 polish 확장(containment HIGH+BOM 외).
```

## STOP 조건 (하나라도 → STOP_REPORT)
```text
2파일 밖/driver 수정 필요 · 기존 16종/핵심 회귀 깨짐 · containment commonpath가 root 밖 STOP/root 안 READY 의미 깸 ·
base가 a41c58e8 아님 · 자동 merge 시도 · scope-guard 수정/수동 .done 필요.
```

## 검증 (완료 전 필수)
```text
pytest tests/regression/test_activation_intended_safety_2774p5.py (기존16+신규) PASS
+ 핵심 회귀 PASS + py_compile PASS
+ root="/" valid path 오판 0 실증 · root 밖/.. 탈출 path → CANARY_PATH_INVALID STOP 실증
```

## 보고 (ANU callback envelope + report)
```text
remediation commit sha · HIGH commonpath 교체 내역 · BOM MED 처리(동봉 시) · driver:1937 evidence-defer 명시 ·
수정 2파일 확인(driver 무접촉) · root="/" 오판 0 재현 · root 밖 path STOP 재현 · 테스트 결과 · CI/Gemini 상태 · ACTIVE=false 유지 · merge-ready 여부.
※ ANU 독립검증(실제 delta a41c58e8..HEAD 기준). 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
```