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

# 계획서: task-2516

**task**: task-2516
**목표**: `utils/replacement_pr_runner.py`의 top-level `merge_queue_executor` import로 인한 circular import를 제거하여 W1 default wiring path(`_WIRING_AVAILABLE=True`)를 활성화한다.
**승인**: 회장 2026-05-09 "task-2515 e2e replay PASS 후 발견된 마지막 pre-pilot blocker 제거"
**근거**: `memory/tasks/task-2516.md` (회장 직접 발행)

---

## 목표

- `replacement_pr_runner.py` import 시 `_WIRING_AVAILABLE=True` 달성 (현재 False).
- ctx hook 명시 없이 default runtime path가 5 모듈 wiring chain을 사용하도록 활성화.
- public contract / 5 모듈 본체 / dispatch.py 변경 0.
- expected_files 정확히 3 파일.

## 범위

### 포함
- `utils/replacement_pr_runner.py` minimal fix (top-level import 제거 → lazy wrapper 함수).
- `tests/regression/test_replacement_pr_runner_2510.py` 회귀 보강 (wiring 활성화 검증 1건).
- `tests/e2e/test_auto_merge_e2e_replay_2515.py` e2e 보강 (ctx hook 없이 default runtime path 1건).

### 제외 (다음 페이즈 이후)
- `merge_queue_executor.py` 변경 (회장 명시 — read-only).
- `automation_contracts.py` 변경 (read-only).
- 5 모듈 본체 (auto_gemini_triage / post_merge_smoke_runner / critical_escalation_reporter) 변경.
- 새 모듈 / 새 abstraction 생성.
- live pilot 직접 시도 (본 task 완료 후).

## 위임 계획

- Phase 1 (구현): **루(백엔드)** — `replacement_pr_runner.py` lazy wrapper 패턴 적용 + wiring 활성화 검증 회귀 테스트 추가.
- Phase 2 (e2e 보강): **루(백엔드)** — `test_auto_merge_e2e_replay_2515.py`에 ctx hook 없는 default runtime path 1건 추가.
- Phase 3 (검증): **모리건(테스터)** — 회귀 + e2e 통과 확인 + wiring smoke (실제 import + `_WIRING_AVAILABLE=True` assert).

## 검증 기준

- import smoke: `python3 -c "from utils import merge_queue_executor as m; assert m._WIRING_AVAILABLE; assert m.ReplacementPRRunner is not None"` → exit 0.
- 회귀: `pytest tests/regression/test_replacement_pr_runner_2510.py -q` → ALL PASS (기존 18~19 + 보강).
- e2e: `pytest tests/e2e/test_auto_merge_e2e_replay_2515.py -q` → 108+ assertions PASS (기존 + default runtime 1건).
- effective diff = expected_files (정확히 3 파일).
