# task-2720+1 — PR #166 P0-a Gemini MEDIUM bounded auto-remediation

## 회장 인가 (2026-05-31)
PR #166(task-2720 P0-a, head `ce87c35c`)은 Critical7 아님·핵심 안전게이트 통과(ANU key 0/active 0/5파일/secret 0). Gemini unresolved MEDIUM 3건을 **bounded 1회 fix/dismiss로 MERGE_READY_CANDIDATE 직전까지 자동수렴**. 회장 개입 없이 진행.

## worktree
- 기존 `/home/jay/workspace/.worktrees/task-2720-dev1` (PR #166 branch `task/task-2720-dev1`, head `ce87c35c`)에서 **이어서 작업**. base origin/main `5e714887`.

## expected_files (task-2720과 동일 5개 — 그 외 수정 금지)
1. `dispatch/anu_owned_callback_enforcement.py` (이식분 — ★ blob 보존 우선)
2. `tests/regression/test_anu_owned_callback_enforcement_2717.py`
3. `dispatch/anu_result_pickup_runner.py`
4. `tests/regression/test_anu_result_pickup_runner_2720.py`
5. `scripts/finish-task.sh`
(evidence: memory/events/task-2720.done · memory/reports/task-2720.md 갱신 허용)

## Gemini MEDIUM 처리 (회장 세부지침 — 봇이 PR #166 comment 직접 조회 후 validity 판정)
PR #166 Gemini finding 조회: `gh api repos/Jeon-Jonghyuk/dev_workspace/pulls/166/comments` (GET).
대상 위치: finish-task.sh:1561 · pickup_runner:206/219/232/346 · 이식모듈:466.

1. **이식모듈 `:466` (_parse ISO)**: PR #163에서 **blob 일치로 가져온 보존 대상** → **dismiss 우선**.
   단 _parse ISO 가 P0-a 실동작(result.json timestamp 파싱)을 **명백히 깨는 버그**면, 그때만 expected_files 안 최소수정 후보로 재분류(blob 일치 깨짐을 보고서에 명시).
2. **pickup runner `206/219/232/346` (robustness/dedupe/observability)**: 신규 P0-a 코드 → **valid면 expected_files 안 bounded fix**. (None/타입 가드·dedupe 정확성·예외 처리 등 실제 결함만. style-only/over-engineering은 dismiss.)
3. **finish-task `:1561` (2>/dev/null)**: result.json 작성 에러를 숨겨 **silent 실패 리스크가 실재하면 최소수정**(에러 표면화). 단순 로그 선호 수준이면 dismiss.

원칙: **severity 아니라 validity/scope/repetition**. dead-code/style/over-engineering = dismiss. 실제 동작/보안 결함만 fix. **bounded 1회** — 동일 semantic 재발 시 LOOP_BOUNDARY 보고(추가 fix 금지).

## 검증
- fix 후 `python3 -m pytest tests/regression/test_anu_result_pickup_runner_2720.py tests/regression/test_anu_owned_callback_enforcement_2717.py -q` 전 PASS(현 28 유지/증가).
- `git diff --name-only origin/main` = 코드 5파일(+evidence). ANU key literal 0 유지. active 완료주장 0 유지.
- semantic 3조건 유지: T2626_ANU_KEY=0 / callback-launch.json 생성=0 / result.json 작성=1.

## 금지 (회장 verbatim)
merge 금지 · **push 금지(ANU 가 수행)** · admin override 금지 · force push/rebase 금지 ·
expected_files 밖 수정 금지 · OS-level crontab/systemd/inotify 설치 금지 · PR #163 close/merge 금지 ·
과거 memory/scripts ANU key literal sanitize 금지 · active 완료 주장 금지 ·
이식모듈 blob 변경 금지(명백한 버그 외).

## finalize (로컬 commit 까지만)
1. fix → regression PASS → `git add` expected_files → 로컬 commit. **push/PR/merge 금지.**
2. `memory/reports/task-2720.md` 에 처리내역(각 finding: FIXED/DISMISSED + 사유) 추가.
3. `memory/events/task-2720+1.done` 생성.
4. ANU normal callback = ANU key(c119085, sealed). ★ ANU key literal 노출 0 (argv/prompt/report).

## ANU 후속 (봇 아님 — ANU governance)
ANU 독립 재검증 → FF push → OWNER gh auth `/gemini review` 1회 + dismiss thread resolve(이식모듈 등) →
CI 11/11 + unresolved 0 + CLEAN/MERGEABLE + diff 5파일 + ANU key 0 + active 0 재확인 →
MERGE_READY_CANDIDATE / NEEDS_SECOND_BOUNDED_FIX / HOLD_CRITICAL7 판정. merge 회장 승인 전 금지.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "dispatch/anu_owned_callback_enforcement.py"
    - "tests/regression/test_anu_owned_callback_enforcement_2717.py"
    - "dispatch/anu_result_pickup_runner.py"
    - "tests/regression/test_anu_result_pickup_runner_2720.py"
    - "scripts/finish-task.sh"
    - "memory/events/task-2720+1.done"
    - "memory/reports/task-2720.md"
  forbidden_paths:
    - ".github/**"
    - "anu_v2/ci_gemini_watcher_runner.py"
    - "anu_v2/ci_gemini_watcher_gh_adapter.py"
  commands:
    - "pytest"
    - "python3 -m pytest"
    - "python3 -m py_compile"
    - "gh"
  merge_policy: "none"
  ttl_hours: 48
```

## ★ dispatch 템플릿 G3(PR/머지) 무시. finalize 로컬 commit only 우선. finish-task --action pr 금지.

## goal_assertions (auto-generated)
- `python3 -m pytest tests/regression/test_anu_result_pickup_runner_2720.py tests/regression/test_anu_owned_callback_enforcement_2717.py -q`
