---
task_id: task-2550
type: plan
scope: task
created: 2026-05-11
updated: 2026-05-11
status: completed
---

# 계획서: task-2550 — .worktrees auto-cleanup policy (post_merge integration)

**task**: task-2550
**목표**: ANU v2 5 모듈 doctrine 박제 — 신규 6번째 모듈 없이 `anu_v2/post_merge_smoke_runner.py`에 6대 안전장치 기반 worktree cleanup 통합 (dry-run default, --apply 회장 별도 승인 필요)
**승인**: 회장 2026-05-11 §명시 "C방안 승인"
**근거**: `/home/jay/workspace/memory/tasks/task-2550.md`

---

## 채택 Option

**Option A**: `anu_v2/post_merge_smoke_runner.py`에 worktree cleanup 통합 + 단일책임 helper `anu_v2/worktree_cleanup.py` 분리.

근거:
1. post-merge lifecycle의 자연스러운 step (smoke PASS + reconcile evidence 다음 단계로 worktree cleanup 적합)
2. task-2539 (post_merge_smoke_runner 박제) doctrine 일관성
3. ANU v2 5 모듈 doctrine 박제 — lifecycle_reconciliation_manager는 reconcile 책임 1개로 단일성 유지

## 목표

머지된 task의 .worktrees 영구 잔존 문제 해결 (현재 81개 누적). 6대 안전장치 PASS 시에만 dry-run 후보로 산출, `--apply` 플래그 시에만 실제 삭제. main worktree 절대 보호.

## 범위

### 포함
1. `anu_v2/worktree_cleanup.py` — 단일책임 helper (6대 안전조건 검증 + dry-run/--apply 모드)
2. `anu_v2/post_merge_smoke_runner.py` — run_post_merge_smoke 후 worktree cleanup 1회 시도 통합 (dry-run only, 새 메서드)
3. `anu_v2/tests/test_worktree_cleanup_2550.py` — 6대 안전조건 + dirty skip + dry-run/--apply 회귀
4. `anu_v2/tests/test_post_merge_smoke_worktree_integration_2550.py` — 통합 트리거 회귀
5. `memory/reports/task-2550.md` — SCQA 보고서

### 제외 (다음 페이즈)
- 실제 81개 .worktrees 정리 (회장 별도 승인 후 `--apply` 1회 실행, 본 task MERGED 이후)
- ci.sh self-test 재실행 (task-2549 영역)

## 6대 안전조건 (worktree 삭제 전 모두 PASS 필수)

1. task `.done.acked` 마커 존재
2. PR state = MERGED (GitHub API 확인)
3. task `.merge-done` 마커 존재
4. branch가 main에 ancestor (`git merge-base --is-ancestor`)
5. worktree 사용 중 X (pgrep / git worktree list lock 검사)
6. dry-run default; `--apply` 명시 시에만 실제 삭제

추가 안전:
- dirty worktree (uncommitted changes) → skip + log `memory/events/worktree-cleanup-skipped-<ts>.json`
- main worktree (워크스페이스 root) 절대 삭제 X

## 위임 계획

- 핵심 helper `anu_v2/worktree_cleanup.py` 구현: **엔키(백엔드)** — Lv.4 control-plane 보안 코드
- 통합점 `post_merge_smoke_runner.py` 수정: **엔키(백엔드)** — anu_v2 단일 책임
- 회귀 테스트 2종: **닌기르수(테스터)** — 6대 안전조건 망라
- UX 검토 (dry-run/apply CLI 메시지): **나부(UX/UI)** — 운영자 메시지 명확성

## 검증 기준

- 6대 안전조건 회귀 PASS: `pytest anu_v2/tests/test_worktree_cleanup_2550.py -v`
- 통합 회귀 PASS: `pytest anu_v2/tests/test_post_merge_smoke_worktree_integration_2550.py -v`
- 기존 test_post_merge_smoke_runner_2539.py 회귀 PASS (기존 API 호환)
- pyright 0 errors: `python3 -m pyright anu_v2/`
- self-test dry-run: 머지된 task의 worktree 삭제 후보 list 출력 (실제 삭제 X) 어설션
- main worktree (워크스페이스 root) 절대 삭제 X 어설션
- 머지 안 된 PR worktree skip 어설션

## 게이트

- G1 Codex 사전 검증: `python3 scripts/codex_gate_check.py --task-id task-2550 --task-file memory/tasks/task-2550.md` → PASS
- G2 마아트(QC) + 로키(보안 레드팀) → PASS
- G3 independent_verifier → PASS (SCQA 패턴)
- Lv.4 sanitize gate: 외부 AI 호출 전 PII 마스킹

## 위험

- ESCALATION 위험: post_merge_smoke_runner의 기존 API 시그니처 변경 시 task-2539 박제 깨짐 → mitigation: cleanup은 새 메서드로 추가, 기존 메서드 시그니처 불변
- 보안 위험: --apply 모드의 worktree 삭제가 실수로 main 삭제 → mitigation: 안전조건 #5 (사용 중 검사) + main path 명시 차단 어설션 + dry-run default
