---
task_id: task-2510
type: checklist
scope: task
created: 2026-05-08
updated: 2026-05-08
status: completed
---

# 체크리스트: task-2510 — replacement_pr_runner

**task**: task-2510 — contaminated PR 자동 replacement 생성

---

## Phase 0 — G1 사전 검증 (팀장)

- [x] A. 3문서 갱신 (plan/context-notes/checklist) — in-progress
- [x] B. Codex 게이트 사전 검증 (작업 전 상태 자명한 critical — 작업 진행 후 재검증)
- [x] C. sanitize 게이트 검토 (코드/테스트에 PII 없음 — 시스템 코드)
- [x] D. 3 Step Why 자문 기록 (context-notes.md)

## Phase 1 — 백엔드 구현 (루/Lugh, 병렬)

- [ ] A. `utils/replacement_pr_runner.py` 생성
- [ ] B. ReplacementPRRunner 클래스 + RunnerType subprocess injection
- [ ] C. detect_contamination() — effective diff vs expected_files
- [ ] D. create_clean_replacement_branch() — origin/main 기준
- [ ] E. transplant_expected_files() — git show 기반, cherry-pick 금지
- [ ] F. preserve_original_pr() — close/delete 금지 + [REPLACED] 코멘트
- [ ] G. create_replacement_pr() — gh pr create
- [ ] H. validate_replacement_diff() — expected_files 정확 일치 검증
- [ ] I. critical escalation 분기 5건 (FORBIDDEN_PATH_INTRUSION/REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFF/REPLACEMENT_PR_FAILED)
- [ ] J. CLI entrypoint (--pr, --dry-run)
- [ ] K. 정적 차단: cherry-pick / force / rebase / admin

## Phase 1 — 테스트 작성 (모리건/Morrigan, 병렬)

- [ ] A. `tests/regression/test_replacement_pr_runner_2510.py` 생성
- [ ] B. T1: clean PR이면 no-op
- [ ] C. T2: effective diff 초과 → contaminated 판정
- [ ] D. T3: forbidden path → Critical FORBIDDEN_PATH_INTRUSION
- [ ] E. T4: expected_files만 clean branch로 이식
- [ ] F. T5: 원 PR close/delete 없이 [REPLACED] 코멘트
- [ ] G. T6: replacement diff == expected_files 정확
- [ ] H. T7: replacement 실패 → Critical (REPLACEMENT_PR_FAILED 또는 REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFF)
- [ ] I. T8: PR #54 effective diff 78건 fixture 재현
- [ ] J. T9: task-2506 / task-2507 contaminated branch fixture 재현
- [ ] K. T10: 자동 cherry-pick 금지 (subprocess args에 cherry-pick → fail)
- [ ] L. T11: force/rebase/admin flag 정적 차단
- [ ] M. T12: ReplacementResult JSON 직렬화

## Phase 2 — 통합 검증 (팀장 + 마아트)

- [ ] A. pytest 12건 PASS (worktree)
- [ ] B. import smoke (ReplacementPRRunner)
- [ ] C. CLI dry-run 동작 검증
- [ ] D. py_compile / pyright (있으면)
- [ ] E. effective diff = 정확히 2 파일 (forbidden path 0)
- [ ] F. 마아트 독립 검증 (G2 의무)

## L1 스모크 + 마무리

- [ ] L1 스모크: pytest 12건 PASS + import smoke + CLI dry-run
- [ ] QC 검증 완료 (qc_verify 자동)
- [ ] 보고서 저장 (`memory/reports/task-2510.md`)
- [ ] worktree finish (--action pr) → Gemini PR 리뷰 → merge
- [ ] G3 독립 검증 PASS
- [ ] finish-task.sh 실행
