# TRACK_F_REPLACEMENT_PR_BASELINE_REAUDIT

- **ts_kst**: 2026-05-21 09:45 KST
- **mode**: read-only audit only · 자동 remediation 0
- **trigger**: ANU 직전 audit baseline error 정정 (회장 2026-05-21 결정) + task-2623 페룬 HOLD F2 finding
- **verdict**: **BASELINE_INVERTED** — 직전 결론 완전 역전

## SCQA

- **Situation**: ANU 직전 audit (anu_v3_pr_merge_partial_closure)이 `utils/replacement_pr_runner.py = 0 lines stub · anu_v2 가 실 구현`으로 결론.
- **Complication**: 페룬이 task-2623 에서 실측 718 lines + v1 callers 4건 + 19 passing tests 발견 → HOLD_SPEC_DRIFT_DETECTED.
- **Question**: replacement PR runner 의 진짜 production baseline 은?
- **Answer**: **v1 (utils/, 718L) 가 production sole source · anu_v2 (442L) 는 parallel orphan (main caller 0)**. 직전 결론 정반대.

## 10항목 확인 결과

### 1~3. 3-way blob sha — **완전 일치**
- HEAD: `1fa8b2d2d9b25288e7e55152fa73b763aad4551b` · 718 lines
- origin/main: `1fa8b2d2d9b25288e7e55152fa73b763aad4551b` · 718 lines
- working-tree: `1fa8b2d2d9b25288e7e55152fa73b763aad4551b` · 718 lines · **clean (dirty 0)**

### 4. Active callers
- **v1 (utils/replacement_pr_runner.py)** main 캘러 **4건**:
  - `utils/merge_queue_executor.py` L63/84/102/162/1120/1255/1745 — **PRODUCTION_WIRED** (실 instantiate L1745)
  - `tests/e2e/test_auto_merge_e2e_replay_2515.py` L41/116/689/697
  - `tests/regression/test_replacement_pr_runner_2510.py` L1/20 (19 cases)
  - `tests/regression/test_orchestration_runtime_2514.py` L87
- **v2 (anu_v2/replacement_pr_runner.py)** main 캘러 **0건** (참조 전부 `.worktrees/*` leftover + 자체 test)

### 5. Existing regression
- `test_replacement_pr_runner_2510.py` = **19 passed in 0.15s** (exit 0) · BH known issue 아님

### 6~7. API diff + module funcs
- v1: **20 module-level funcs** + `ReplacementPRRunner(runner=None, dry_run=False, ...)` + `execute(pr_number, task_spec)` + CLI `main()`
- v2: 3 private helper + `ReplacementPRRunner(*, gh_runner, git_runner, audit_writer, ...)` + 분리 메서드
- → **SAME_NAME_DISJOINT_API** (drop-in shim 불가 · v1 의 8 utility func 가 v2 부재)

### 8. v1/v2 coexistence
- v1 = live production · v2 = isolated parallel orphan
- 두 모듈 disjoint signature 로 공존하나 production path 는 v1 단일

### 9. Merge queue 사용
- `merge_queue_executor.py L1745` `replacement_runner=ReplacementPRRunner(runner=runner, dry_run=args.dry_run)` — v1 실 사용
- `REPLACEMENT_PR_RUNNER_HOOK` (L162) + W2 `ctx.replacement_runner.execute()` (L1255)

### 10. Safe migration
- **OPT_V (NO_MIGRATION_NEEDED)** 권장

## Baseline error root cause
- ANU 측정법 결함: working-tree `wc -l` 단독 측정 · git blob 미확인
- 실제 원인: 측정 시점 file 이 `stash@{0} "task-2623 stash"` (또는 과거 `stash@{3} "task-2569 ... utils/replacement_pr_runner.py"`) 로 빠져있던 중간상태
- **메타 교훈**: audit baseline 확정 시 working-tree `wc -l` 단독 신뢰 금지 → **HEAD blob / origin/main blob / working-tree 3-way 교차검증 필수**

## Migration 옵션 평가

- **OPT_V (NO_MIGRATION_NEEDED)** ★권장 — v1 이 곧 v3 import path · 변경 0 · regression risk NONE · "v3 shim" 은 false-gap
- **OPT_W (anu_v2 deprecation review)** — BACKLOG_LOW · anu_v2 orphan(caller 0) dead-code 검토
- OPT_X/Y (v1→v2 cutover) — **REJECT** (v2 가 v1 superset 아님 · production caller 0 · 19 tests + merge_queue 파손 위험)
- OPT_Z (현재 spec 강행) — **REJECT** (회장 '기존 spec 강행 금지' 직접 위배)

## Downstream impact — 직전 Track F audit 5 artifacts INVALIDATED
- `replacement_pr_dry_run_matrix.json` (utils stub 가정)
- `auto_pr_creation_readiness.result.json` (v3 module gap 가정)
- `replacement_pr_v3_gap_closure.result.json` (0 lines 가정)
- `replacement_pr_v3_adapter_proposal.json` (thin shim 가정)
- `replacement_pr_dry_run_fixture_matrix.json` (anu_v2 sole source 가정)

여전히 유효: `merge_gate_14_condition_matrix.json` / `merge_queue_14_condition_matrix_v2.json` / `bot_token_redacted_preflight.json` / `reconcile_evidence_contract_proposal.json` (모두 utils/merge_queue_executor.py 직접 audit · replacement runner baseline 무관)

## Critical7 — false
- read-only audit · 코드 변경 0 · PR/merge/credential write 0

## 회장 결정 필요
1. OPT_V (NO_MIGRATION_NEEDED) ACCEPT — task-2623 기존 spec 폐기 확정
2. OPT_W (anu_v2 deprecation review) backlog 등록 여부 (dev 봇 재가동 정책 연계)
3. 직전 Track F 5 invalidated artifacts 정정 마커/superseded 표기
4. task-2624 reconcile evidence contract 독립 진행 가능 여부

**auto_progress**: false · **read-only audit only · 자동 remediation 0**

## 산출물
- `memory/events/replacement_pr_runner_baseline_reaudit.result.json`
- `memory/events/replacement_pr_runner_api_diff_matrix.json`
- `memory/events/replacement_pr_runner_callers_matrix.json`
- `memory/events/replacement_pr_runner_migration_options.json`
- `memory/reports/replacement_pr_runner_baseline_reaudit.md`
