---
task_id: task-2539
type: plan
scope: task
created: 2026-05-10
updated: 2026-05-10
status: completed
---

# 계획서: task-2539

**task**: task-2539
**목표**: ANU v2 post_merge_smoke_runner v0 구현 — BOT squash merge 후 main 기준 smoke 실행 + `.smoke-evidence` 독립 marker 박제 + Critical 7종 #7 분류
**승인**: 회장 2026-05-10 "task-2537 POST_MERGE_AUDIT WARN→PASS 직후 본 모듈 정식 발행"
**근거**: memory/tasks/task-2539.md (회장 §명시), task-2524 박제 fixture, task-2537 backfill 사례

---

## 목표

- `anu_v2/post_merge_smoke_runner.py` (NEW) — `PostMergeSmokeRunner` 클래스 + 6 method
- 회귀 9/9 PASS (smoke PASS marker / FAIL Critical 7 / 우선순위 / idempotent / chat 격리 / token 0 / md fallback 금지 / timeout / contract)
- fixtures 2건 (task-2524 PASS 사례, task-2537 WARN→PASS backfill)
- md/report 문구 fallback 절대 금지 — 실제 runner output / marker / exit code 기준만 판정
- one-way isolation: anu_v2 외부 import 금지

## 범위

### 포함
- `anu_v2/post_merge_smoke_runner.py` 본체
- `anu_v2/tests/test_post_merge_smoke_runner_2539.py` 회귀 9건
- `anu_v2/fixtures/post_merge_smoke_pass_task_2524.json`
- `anu_v2/fixtures/post_merge_smoke_warn_to_pass_task_2537.json`
- 보고서 + .done

### 제외 (다음 페이즈 이후)
- `lifecycle_reconciliation_manager` (별도 task)
- 자체 회장 보고 (호출자 책임)
- Backfill 책임 (read-only audit checker가 별도 결정)

## 위임 계획

- 본체 + 회귀 + fixtures: **루(백엔드)** — sonnet — 단일 파일 SCQA 단위, parallel 분해 효과 낮음
- 검증/L1 스모크/보고서: **다그다(팀장)** — 직접 수행
- (필요시) 회귀 보강: **모리건(테스터)** — 루의 결과 미흡 시 호출

## 검증 기준

- pytest 실행: `python3 -m pytest anu_v2/tests/test_post_merge_smoke_runner_2539.py -v` → 9/9 PASS
- forbidden_paths 0건 (utils/, dispatch/, scripts/, dashboard/, teams/, 다른 anu_v2 모듈)
- expected_files 정확 4개 (코드 2 + fixtures 2)
- 회귀 #7 (md/report fallback 금지) PASS — task-2537 fixture 재현
- 회귀 #1 자체 변형: 본 모듈로 task-2539.smoke-evidence 박제 가능성 확인
