# task-2516+1 — task-2516 옵션 B clean branch replay (회장 결정 후 재발행)

- 작업 유형: **clean branch replay + 3파일 minimal fix** (force-with-lease 거부, 옵션 B 채택)
- 작업 레벨: **Lv.2**
- 우선순위: **★★★ blocking** (live pilot 진입 전 마지막 게이트)
- Track: **clean_branch_replay / contaminated_ancestry_recovery / option_b / pre_pilot_blocker**
- parallel_policy: **serial_only**
- 일시: 2026-05-09
- 회장 결정: 2026-05-09 직접 — task-2516 옵션 B 채택, force-with-lease 거부

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

> task-2516은 옵션 B(clean branch replay)로 진행한다. force-with-lease 승인하지 않는다.
>
> **이번 케이스는 코드 문제보다 branch ancestry contamination 문제다.**
> 회장 운영 원칙은 clean topology 유지가 우선이며,
> replacement/replay 철학과 동일하게 clean branch 재생성이 맞다.
>
> **이번 케이스는 실패가 아니라 SCOPE-GUARD가 stale ancestry contamination을 정상 탐지한 dogfooding 사례로 기록한다.**

## SCOPE-GUARD dogfooding 사례 박제 (회장 명시)

- task-2516 작업 중 SCOPE-GUARD가 contaminated ancestry 탐지
- task-2516의 commit `e9f807e7` (루: circular import 제거)는 코드 자체는 옳지만 stale base에 올라감
- 자동화 시스템이 "코드 옳음 ≠ 머지 가능"을 정상 분리한 첫 케이스
- 이 사례는 task-2510 replacement_pr_runner 철학(clean origin/main 기준 + expected_files만 이식)의 운영 검증

## dependency (모두 충족)

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

## 기존 task-2516 처리 (회장 §6 — 보존 + [REPLACED])

- 기존 worktree: `.worktrees/task-2516-dev3/`
- 기존 branch: `task/task-2516-dev3` (origin push 완료, commit `e9f807e7`)
- 기존 PR: **미생성** (PR 단계 진입 전이라 [REPLACED] PR comment 불필요)
- 처리: branch는 contaminated ancestry로 보존, 본 task가 새 branch에서 동일 fix를 옵션 B로 replay
- 절대 금지: force push / rebase / 기존 branch delete

## 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: "clean_branch_replay / contaminated_ancestry_recovery / w1_wiring_default"

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

parallel_policy: "serial_only"

merge_queue_position: 14

stale_recheck_required: true

cherry_pick_allowed: false
```

## 회장 명시 7단계 (★ 절대 준수)

### 1. 기존 task/task-2516-dev3 branch는 contaminated ancestry로 간주
- 본 task는 기존 branch를 **재사용 금지** (★ contaminated branch 재활용 금지 정책 정합)

### 2. origin/main 최신 HEAD 기준 새 clean branch 생성
- `git fetch origin main` 선행
- `git worktree add -b task/task-2516+1-dev3 .worktrees/task-2516+1-dev3 origin/main`
- 즉 task-2510의 `replacement_pr_runner` 철학 그대로 적용

### 3. 허용 3파일만 replay
- `utils/replacement_pr_runner.py` (★ minimal fix 본체 — top-level circular import 제거)
- `tests/regression/test_replacement_pr_runner_2510.py` (회귀 보강 — `_WIRING_AVAILABLE=True` assert)
- `tests/e2e/test_auto_merge_e2e_replay_2515.py` (e2e 보강 — default runtime path 1건)
- 다른 파일 수정 0 (회장 §expected_files 외 수정 금지)

### 4. effective diff == expected_files 재검증
- `git diff origin/main...HEAD --name-only` = 정확히 3 파일
- task-2510 본체의 `compare_effective_diff` 사용 (자기참조)

### 5. 새 PR 생성
- branch: `task/task-2516+1-dev3`
- title: `[task-2516+1] dev3: replacement_pr_runner W1 fix (옵션 B clean replay)`
- body: SCOPE-GUARD dogfooding 사례 명시 + 기존 task-2516 PR 없음 명기

### 6. 기존 PR/branch는 보존하되 [REPLACED] 처리
- 기존 task-2516 PR: 미생성이므로 PR-level [REPLACED] 코멘트 불필요
- 기존 branch `task/task-2516-dev3`: 보존 (force push / delete 절대 금지)
- 다그다는 본 task 시작 시 기존 worktree에서 `worktree finish` 호출하지 말고 단순 abandon

### 7. force push / rebase / admin override 금지 유지
- `git push --force` 금지
- `git rebase` 금지
- `gh pr merge --admin` 금지
- `--force-with-lease` 거부 (회장 직접 명시)

## 필수 구현 5건 (task-2516 §1~5 동일)

1. circular import 제거 (`replacement_pr_runner.py` top-level `compare_effective_diff` import 삭제)
2. lazy import 또는 dependency injection 변경 (1파일 minimal fix 원칙)
3. `_WIRING_AVAILABLE=True` 경로 default 활성화 검증
4. ctx 명시 hook 없이도 W1 wiring 작동 확인
5. public contract 변경 0 (`automation_contracts.py` / `merge_queue_executor.py` public / 5 모듈 본체 / dispatch.py 미변경)

## 필수 검증 5건 (task-2516 §1~5 동일)

1. `pytest tests/regression/test_replacement_pr_runner_2510.py -q` → ALL PASS
2. `pytest tests/e2e/test_auto_merge_e2e_replay_2515.py -q` → 108 assertions PASS
3. import smoke (circular 0)
4. `_WIRING_AVAILABLE=True` 회귀 assert
5. e2e default runtime path 1건 추가 검증

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

- **force push 금지** (★ 회장 직접 거부)
- **force-with-lease 금지** (★ 회장 직접 거부)
- **rebase 금지**
- **기존 task/task-2516-dev3 branch 재사용 금지** (★ contaminated ancestry)
- **기존 task/task-2516-dev3 branch delete 금지** (★ 보존)
- **admin override 금지** (`gh pr merge --admin`)
- **manual .done 금지**
- **required CI bypass 금지**
- **merge_queue_executor 대규모 수정 금지**
- **automation_contracts 변경 금지**
- **auto_gemini_triage 변경 금지**
- **post_merge_smoke_runner 변경 금지**
- **critical_escalation_reporter 변경 금지**
- **dispatch.py 수정 금지**
- **PR #52/#49/#50/#51 수정 금지**
- **expected_files 외 수정 금지** (정확히 3 파일)
- **자동 cherry-pick 구현 금지**
- **새 모듈 / 새 abstraction 생성 금지**
- **enum / contract schema 변경 금지**
- **live pilot 직접 시도 금지** (본 task 완료 후 회장 승인)
- **Critical 7종 외 회장 보고 금지**
- **amendment 무시 / mid-dispatch correction 무시 금지**
- **정책 md만 작성하고 종료 금지**

## 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+1*"
    - "memory/reports/task-2516+1*"
    - "memory/events/task-2516+1*"
    - "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:
    - "force push"
    - "force-with-lease"
    - "rebase"
    - "기존 task/task-2516-dev3 branch 재사용"
    - "기존 task/task-2516-dev3 branch delete"
    - "admin override (gh pr merge --admin)"
    - "manual .done 생성"
    - "required CI bypass"
    - "merge_queue_executor 대규모 수정"
    - "automation_contracts 변경"
    - "auto_gemini_triage 변경"
    - "post_merge_smoke_runner 변경"
    - "critical_escalation_reporter 변경"
    - "dispatch.py 수정"
    - "PR #52/#49/#50/#51 수정"
    - "expected_files 외 수정"
    - "자동 cherry-pick 구현"
    - "새 모듈 / 새 abstraction 생성"
    - "enum / contract schema 변경"
    - "live pilot 직접 시도"
    - "Critical 7종 외 회장 보고"
    - "amendment 무시 / mid-dispatch correction 무시"
    - "정책 md만 작성하고 종료"
```

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

1. ✅ 새 clean branch `task/task-2516+1-dev3` (origin/main 최신 HEAD 기반)
2. ✅ effective diff = 정확히 3 파일 (회장 §3, §4)
3. ✅ circular import 제거 + `_WIRING_AVAILABLE=True` default 활성화
4. ✅ 회귀/e2e PASS
5. ✅ 새 PR 생성 (회장 §5)
6. ✅ 기존 task/task-2516-dev3 branch 보존 (force push 0, delete 0)
7. ✅ Critical 7종 0건
8. ✅ Merge Topology Gate 자기참조 PASS
9. ✅ CI 11/11 SUCCESS
10. ✅ public contract / 5 모듈 본체 / dispatch.py 변경 0건
11. ✅ amendment 보호 의무 명시 + 적용 evidence

## 시스템 3문서 참조

- 정책 본체: `memory/feedback/feedback_critical_escalation_only_260508.md`
- replacement_pr_runner 철학 (task-2510): `utils/replacement_pr_runner.py` (본 task의 self-host 사례)
- 본 task fix 대상: `utils/replacement_pr_runner.py` top-level circular import

## 후행 (회장 명시 순서)

본 task 완료 후:
1. **low-risk live pilot** (1건, 회장 승인 + task-2515 후보 활용)
2. **lifecycle reconciliation hardening**
3. **canonical workspace resolver hardening**

## affected_files (auto-detected)
- utils/replacement_pr_runner.py (modify, top-level import 제거)
- tests/regression/test_replacement_pr_runner_2510.py (회귀 보강)
- tests/e2e/test_auto_merge_e2e_replay_2515.py (e2e 보강)

## goal_assertions (auto-generated)
- `git log --oneline origin/main..HEAD` (정확히 1~3 commit, ancestry clean)
- `git diff origin/main...HEAD --name-only` (정확히 3 파일)
- `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')"`