# task-2716+2 — PR #162 same-PR micro-fix 1라운드 (정확히 2건, dev4)

- **팀**: dev4-team (비슈누)
- **PR**: #162 (https://github.com/Jeon-Jonghyuk/dev_workspace/pull/162)
- **★ 작업 위치**: `/home/jay/.cokacdir/workspace/wt-2716-clean` (branch `task/task-2716-clean-dev4`). 시작 시 `git fetch origin && git merge --ff-only origin/task/task-2716-clean-dev4` 로 **head `8cd6e768`** 까지 FF 후 그 위에 작업. `/home/jay/workspace`(오염) 사용 금지. 새 worktree 금지.
- **분류**: AUTO_REMEDIATION 1라운드 (회장 인가, Critical7 0·scope 0·credential 0·expected_files 내부)

## 수정 대상 — 정확히 2건만 (그 외 전부 금지)

### 1. scripts/finish-task.sh — `--diff-filter=d` 추가 (cleanup 삭제파일 false-block 방지)
- 현재 556줄: `_HG_DIFF=$(git -C "$_HG_PROJ_DIR" diff --name-only "${_HG_MAIN}...HEAD" ...)`
- **fix**: hygiene diff 추출에서 **삭제(deleted) 파일을 제외**한다 (소문자 `--diff-filter=d` = 삭제 제외). 두 fallback 모두 동일 적용. 예: `git diff --name-only --diff-filter=d "${_HG_MAIN}...HEAD"`.
- **이유**: cleanup 커밋이 artifact 삭제만 하는 경우, 삭제파일이 diff에 잡혀 expected_files 미선언 시 가드가 정당한 push를 false-block. 삭제는 contamination 아님 → 제외.
- **금지**: success/failure/callback behavior 변경 0. diff 추출 라인만.

### 2. scripts/harness/v36/pr_diff_hygiene_guard.py — docstring/impl 정합 (§Affected Files 문구 제거)
- 현재 `extract_expected_files` docstring(181줄): "expected_files 섹션(YAML 블록 또는 **§Affected Files**)에서 경로 수집" — 그러나 실제 regex(188줄)는 `expected_files:` 만 매칭. §Affected Files 미수집.
- **fix**: docstring에서 **§Affected Files 수집 주장 제거** (실제 구현=expected_files만 과 정합).
- **금지**: regex/파서 behavior 확대 0 (§Affected Files 수집 추가 절대 금지). docstring 문구만.

## ② trailing slash = 설계 인정 (수정 금지, 단 의도 명시 허용)
- 회장 결정: bare directory(`memory/reports`)를 하위 전체 allowlist로 해석하지 않는다. 하위 전체 허용은 trailing slash(`memory/reports/`) 명시 필요. **이건 가드 정밀도 위한 의도된 보수 동작.**
- **허용(선택)**: `_is_allowed` 또는 모듈 docstring/주석에 "bare dir는 prefix-allow 아님, 하위 허용은 trailing slash 필요" 1~2줄 **문서화만**. ★matching behavior 변경 절대 금지(broad allowlist 0).
- 가능하면 이 의도를 test 1개로 고정(예: `memory/reports`(no slash) + `memory/reports/x.md` → BLOCK) — evidence-based resolve 근거용.

## ④ YAML flow-style = addressed 인정, 재수정 0
- 195~200줄에 flow-style 분해+중복방지 이미 구현(8cd6e768). 재수정 금지. line/diff/test evidence 기반 resolve 후보로 둠.

## 검증 (전부 PASS 후 완료)
- guard tests PASS (기존 + ① ③ 관련 regression / ② 의도 test 추가 가능)
- 회귀 PASS (task-2712 + harness)
- `bash -n scripts/finish-task.sh` PASS
- `git diff --name-only origin/main...HEAD` = **expected_files only** (forbidden path 0)
- 각 thread resolve 근거용 evidence(line/diff/test) 정리: ① diff-filter ② 설계+test ③ docstring ④ 이미 fix된 라인 인용

## push 정책
- dev bot App token 부재 → **push 하지 마라**. wt-2716-clean 로컬 commit 까지만. push 는 ANU 가 OWNER PAT FF push.

## 하드캡 (회장 verbatim)
- same-PR micro-fix **1라운드만**. push 후 fresh Gemini 재리뷰 확인. **새 valid finding 또 나오면 자동 수정 금지 → LOOP_BOUNDARY 회장 보고.**

## 금지
trailing slash broad allowlist 수정 · regex §Affected Files 수집 추가 · replacement PR · task-2713/2714/2715 · closeout_marker_watcher 추가 · task-2703 혼입 · CI workflow(.github/workflows) 수정 · memory/events·artifacts·callback·evidence PR diff 포함 · unresolved 상태 merge-ready 선언 · force push · rebase.

## 완료 시 ANU normal callback (ANU key c119085addb0f8b7, self-key 금지)
envelope 필드: task_id=**task-2716+2** / new_commit_sha / files_changed_2 / bash_n / guard_test / expected_files_only=true / ci_workflow_untouched=true / resolve_evidence_path / schedule_id / collector_role=ANU / self_key_used=false. ★envelope 작성만으론 미완 — schedule_id 생성까지. stale task-2712 envelope 재사용 0. 상세 report 1개.
