---
task_id: task-2512
type: plan
scope: task
created: 2026-05-09
updated: 2026-05-09
status: completed
---

# 계획서: task-2512

**task**: task-2512 — post_merge_smoke_runner: main 기준 smoke 자동 실행
**목표**: 자동 머지 직후 `merge_commit` 기준 origin/main smoke를 자동 실행하고, 실패 시에만 Critical #7 (POST_MERGE_SMOKE_FAILED) escalation packet을 생성하는 실행 가능한 코드 + 12건 회귀 테스트 산출.
**승인**: 회장 2026-05-09 직접 발행 (5 모듈 #4)
**근거**: `memory/tasks/task-2512.md`, `memory/feedback/feedback_critical_escalation_only_260508.md`, `utils/automation_contracts.py` (task-2509+2 freeze)

---

## 목표

- `utils/post_merge_smoke_runner.py`: `run_post_merge_smoke(task_file, merge_commit, dry_run, runner=None)` API + CLI
- `tests/regression/test_post_merge_smoke_runner_2512.py`: 12 회귀 테스트 PASS (4 replay fixture 포함)
- 회장 명시 §1~10 전부 충족, Critical 7종 외 보고 0건, expected_files 외 수정 0건
- task-2513과 disjoint (critical_escalation_reporter 미구현, packet 생성만), task-2514 wiring 보류

## 범위

### 포함
- `merge_commit` 기준 main HEAD fast-forward 검증 + stale 판정
- task spec에서 `smoke_command` 추출 (yaml block + registry) — `load_task_spec` 호출
- subprocess timeout (default 600s) + zombie 방지 (subprocess.kill 폴백)
- stdout/stderr head/tail capture (default 64KB cap)
- PASS / FAIL / SKIPPED / TIMEOUT / BLOCKED 5상태 분류
- `SmokeResult` (frozen contract) 채움 + 추가 envelope `PostMergeSmokeRun` (merge_commit/task_id/duration_ms/allow_continuation/escalation/stale)
- 실패 시 `EscalationPacket(escalation_type=CriticalEscalationType.POST_MERGE_SMOKE_FAILED, ...)` 생성
- replay fixture 4개 (task-2506/2507/2509/2511) 동일 결과 재현
- CLI: `--task-file --merge-commit --dry-run|--apply --no-audit`

### 제외 (task-2514 wiring 단계)
- `merge_queue_executor` import/wiring (회장 명시 금지)
- `dispatch.py` 수정 (회장 명시 금지)
- task-2513 영역 (`critical_escalation_reporter` 구현)
- 자동 cherry-pick / admin override / required CI bypass

## 위임 계획

- **MT-1 ~ MT-7 구현** (`utils/post_merge_smoke_runner.py`): **루(백엔드)** — Python subprocess + dataclass 설계
- **MT-8 ~ MT-12 회귀 테스트**: **모리건(테스터)** — pytest 12 케이스 (replay fixture 포함)
- **G1 Codex 사전 검증**: 다그다 — 설계 검토 (구현 시작 전)
- **G2 Gemini PR review + 마아트 독립 검증**: 다그다 — PR 생성 후
- **G3 머지 게이트**: `g3_independent_verifier.py` PASS → Gemini 리뷰 → auto-merge

## 검증 기준

- 코드: `python3 utils/post_merge_smoke_runner.py --task-file memory/tasks/task-2512.md --merge-commit 59ec8d37 --dry-run` → SmokeResult JSON 출력
- 회귀: `pytest tests/regression/test_post_merge_smoke_runner_2512.py -q` → 12/12 PASS
- 4 replay fixture: task-2506/2507/2509/2511 SHA 입력 시 동일 SmokeResult 재현
- effective diff = 정확히 2 파일 (Merge Topology Gate)
- forbidden path: 0
- 회장 보고: Critical 7종 외 0건
