# task-2516 — task-2514 W1 circular import fix (default wiring path 활성화)

- 작업 유형: **circular import 제거 + wiring 활성화 검증** (신규 기능 X, 정책 문서 X)
- 작업 레벨: **Lv.2**
- 우선순위: **★★**
- Track: **circular_import_fix / w1_wiring_default_active / pre_pilot_blocker**
- parallel_policy: **serial_only**
- 일시: 2026-05-09
- 회장 결정: 2026-05-09 직접 발행 (task-2515 e2e replay PASS 후 발견된 blocker)

## ⚠️ 본 task의 본질 — 회장 명시

> task-2515 e2e replay에서 발견된 W1 wiring blocker 제거.
> `replacement_pr_runner.py`의 top-level `compare_effective_diff` import로 인해
> task-2514 W1 wiring이 `_WIRING_AVAILABLE=False`가 되는 문제 해소.
> **default runtime path가 ctx hook 없이도 활성화되도록** 한다.
>
> 원칙은 1파일 minimal fix이나, wiring 활성화 검증을 위해 기존 회귀/e2e 테스트 보강 허용.
> 새로운 모듈 생성 금지.

## 시스템 상태

- ✅ **CODE_AUTOMATION_SYSTEM_PHASE_1_COMPLETE** (task-2514 wiring, mergeCommit `4f94e1ad`)
- ✅ **AUTO_MERGE_E2E_REPLAY_PASS** (task-2515 e2e harness, mergeCommit `05259f81`, Critical 7종 0건)
- ⚠ **W1 default wiring path 비활성** (`_WIRING_AVAILABLE=False`, ctx hook 강제) ← 본 task 해소 대상
- 🔒 low-risk live pilot은 본 task 완료 후에야 진입

## dependency (모두 충족)

- ✅ task-2514.merged (PR #65, 5 모듈 wiring)
- ✅ task-2515.merged (commit `05259f81`, e2e replay harness)

## Merge Topology Gate metadata

```yaml
expected_files:
  - "utils/replacement_pr_runner.py"
  - "tests/regression/test_replacement_pr_runner_2510.py"
  - "tests/e2e/test_auto_merge_e2e_replay_2515.py"

risk_area: "circular_import / w1_wiring_default / replacement_pr_runner_import_chain"

dependency:
  - "task-2514.merged"
  - "task-2515.merged"

parallel_policy: "serial_only"

merge_queue_position: 13

stale_recheck_required: true

cherry_pick_allowed: false
```

## 회장 명시 — 1파일 원칙 + 보강 허용 (★)

본 task는 회장 명시 §주의로 expected_files **정확히 3 파일**:
- 1: `utils/replacement_pr_runner.py` (★ minimal fix 본체)
- 2: `tests/regression/test_replacement_pr_runner_2510.py` (회귀 보강 — wiring 활성화 검증)
- 3: `tests/e2e/test_auto_merge_e2e_replay_2515.py` (e2e 보강 — default runtime path 1건)

회귀/e2e 보강은 wiring 활성화 검증을 위해서만. 신규 모듈 / 신규 abstraction 추가 0.

## 필수 구현 5건 (회장 §1~5)

### 1. circular import 제거
- `utils/replacement_pr_runner.py`의 top-level `compare_effective_diff` import 제거
- 다른 5 모듈 import도 wiring 차단 원인이면 동일 처리

### 2. lazy import 또는 dependency injection 변경
- 옵션 A: lazy import (함수 내부 import)
- 옵션 B: dependency injection (caller가 주입)
- 옵션 C: protocol/typing.TYPE_CHECKING 활용
- 1파일 minimal fix 원칙에 가장 적합한 방법 선택

### 3. `_WIRING_AVAILABLE=True` 경로 default 활성화 검증
- task-2514 W1에서 `_WIRING_AVAILABLE` 또는 동등 runtime readiness flag 확인
- ctx hook 명시 없이도 default runtime이 wiring 활성화

### 4. ctx 명시 hook 없이도 W1 wiring 작동 확인
- `evaluate_pr()` 또는 동등 entry에서 ctx 미주입 시 default runtime path가 5 모듈 chain 사용

### 5. public contract 변경 0
- `utils/automation_contracts.py` 미변경
- `utils/merge_queue_executor.py` public 인터페이스 미변경
- 5 모듈 본체 (auto_gemini_triage / post_merge_smoke_runner / critical_escalation_reporter) 미변경
- task-2509 본체 인터페이스 breaking change 0

## 필수 검증 5건 (회장 §1~5)

1. `pytest tests/regression/test_replacement_pr_runner_2510.py -q` → ALL PASS (기존 18~19건 + 신규 보강)
2. `pytest tests/e2e/test_auto_merge_e2e_replay_2515.py -q` → 108 assertions PASS (기존 + default runtime 1건 추가)
3. import smoke:
   - `from utils.replacement_pr_runner import ReplacementPRRunner`
   - `from utils.merge_queue_executor import evaluate_pr` (또는 wiring 진입점)
   - 두 import 모두 ImportError / circular 없이 성공
4. `_WIRING_AVAILABLE` (또는 동등 runtime readiness flag) = `True` 검증 (회귀에서 assert)
5. task-2515 e2e replay에서 **ctx hook 없이 default runtime path** 최소 1건 검증 (clean auto merge case 권장)

## 금지 행위 (회장 명시 — 절대 준수)

- **merge_queue_executor 대규모 수정 금지** (W1 영향 지점 외 변경 0)
- **automation_contracts 변경 금지** (`utils/automation_contracts.py` 수정 0)
- **auto_gemini_triage 변경 금지**
- **post_merge_smoke_runner 변경 금지**
- **critical_escalation_reporter 변경 금지**
- **dispatch.py 수정 금지**
- **정책 md 작성만 하고 종료 금지**
- **force push / rebase / admin override / manual .done 금지**
- **required CI bypass 금지**
- **PR #52/#49/#50/#51 수정 금지**
- **expected_files 외 수정 금지** (정확히 3 파일)
- **자동 cherry-pick 구현 금지**
- **새 모듈 / 새 abstraction 생성 금지**
- **enum / contract schema 변경 금지**
- **live pilot 직접 시도 금지** (본 task = 마지막 blocker, pilot은 본 task 완료 후)
- **Critical 7종 외 회장 보고 금지**
- **amendment 무시 / mid-dispatch correction 무시 금지**

## allowed_resources

```yaml
allowed_resources:
  read_only_paths:
    - "memory/tasks/task-2509*"
    - "memory/tasks/task-2510*"
    - "memory/tasks/task-2511*"
    - "memory/tasks/task-2512*"
    - "memory/tasks/task-2513*"
    - "memory/tasks/task-2514*"
    - "memory/tasks/task-2515*"
    - "memory/tasks/task-2516*"
    - "memory/feedback/feedback_critical_escalation_only_260508.md"
    - "utils/automation_contracts.py"          # READ ONLY
    - "utils/merge_queue_executor.py"          # READ ONLY (W1 활성화 영향 분석용)
    - "utils/auto_gemini_triage.py"            # READ ONLY
    - "utils/post_merge_smoke_runner.py"       # READ ONLY
    - "utils/critical_escalation_reporter.py"  # READ ONLY
    - "utils/merge_topology_gate.py"           # READ ONLY
    - "tests/e2e/fixtures/auto_merge_replay_2515.json"  # fixture READ ONLY
    - "memory/orchestration-audit/merge-queue.jsonl"
    - "memory/task-timers.json"
    - ".env.keys"
  paths:
    - "memory/tasks/task-2516*"
    - "memory/reports/task-2516*"
    - "memory/events/task-2516*"
    - "utils/replacement_pr_runner.py"                          # ★ minimal fix
    - "tests/regression/test_replacement_pr_runner_2510.py"     # 회귀 보강
    - "tests/e2e/test_auto_merge_e2e_replay_2515.py"            # e2e 보강
  forbidden_actions:
    - "merge_queue_executor 대규모 수정"
    - "automation_contracts 변경"
    - "auto_gemini_triage 변경"
    - "post_merge_smoke_runner 변경"
    - "critical_escalation_reporter 변경"
    - "dispatch.py 수정"
    - "정책 md 작성만 하고 종료"
    - "force push"
    - "rebase"
    - "admin override (gh pr merge --admin)"
    - "manual .done 생성"
    - "required CI bypass"
    - "PR #52/#49/#50/#51 수정"
    - "expected_files 외 수정"
    - "자동 cherry-pick 구현"
    - "새 모듈 / 새 abstraction 생성"
    - "enum / contract schema 변경"
    - "live pilot 직접 시도"
    - "Critical 7종 외 회장 보고"
    - "amendment 무시 / mid-dispatch correction 무시"
```

## 완료 조건 (회장 명시)

1. ✅ circular import 제거 (`replacement_pr_runner.py` top-level 삭제 또는 lazy/DI 변경)
2. ✅ default wiring path 활성화 (`_WIRING_AVAILABLE=True` 또는 동등 flag)
3. ✅ 회귀/e2e PASS (regression 18~19 + e2e 108 + 신규 보강 = ALL PASS)
4. ✅ effective diff == expected_files (정확히 3 파일)
5. ✅ forbidden path 0
6. ✅ Critical 7종 0건
7. ✅ Merge Topology Gate 자기참조 PASS
8. ✅ CI 11/11 SUCCESS
9. ✅ public contract / 5 모듈 본체 / dispatch.py 변경 0건
10. ✅ amendment 보호 의무 명시 + 적용 evidence

## 시스템 3문서 참조

- 정책 본체: `memory/feedback/feedback_critical_escalation_only_260508.md`
- task-2514 wiring 본체: `utils/merge_queue_executor.py` (W1 활성화 대상)
- task-2515 e2e harness: `tests/e2e/test_auto_merge_e2e_replay_2515.py` (default runtime 검증 보강)
- 본 task fix 대상: `utils/replacement_pr_runner.py` top-level circular import

## 후행 (회장 명시)

본 task 완료 = **마지막 pre-pilot blocker 제거**. 다음 단계:
- low-risk live pilot 1건 (회장 승인 + task-2515 후보 선정 활용)
- pilot 성공 시 자동화 시스템 운영 단계 진입

## affected_files (auto-detected)
- utils/replacement_pr_runner.py (modify, top-level import 제거 + lazy/DI)
- tests/regression/test_replacement_pr_runner_2510.py (회귀 보강 — _WIRING_AVAILABLE assert)
- tests/e2e/test_auto_merge_e2e_replay_2515.py (e2e 보강 — default runtime 1건)

## goal_assertions (auto-generated)
- `pytest tests/regression/test_replacement_pr_runner_2510.py -q`
- `pytest tests/e2e/test_auto_merge_e2e_replay_2515.py -q`
- `python3 -c "from utils.replacement_pr_runner import ReplacementPRRunner; from utils.merge_queue_executor import evaluate_pr; print('import ok')"`
- `_WIRING_AVAILABLE` flag = True (회귀 assert)