# task-2515 — auto-merge e2e replay harness (5 모듈 runtime pipeline 실전 검증)

- 작업 유형: **end-to-end 검증 코드 + replay harness** (신규 기능 추가 X, 정책 문서 X)
- 작업 레벨: **Lv.3+** (시스템 검증)
- 우선순위: **★★★ blocking** (live pilot 진입 전 필수 게이트)
- Track: **e2e_replay_harness / auto_merge_runtime_verification / phase_2_validation**
- parallel_policy: **serial_only**
- 일시: 2026-05-09
- 회장 결정: 2026-05-09 직접 발행 (task-2514 완료 인정 후)

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

> 본 task는 신규 기능 추가가 아니라 **end-to-end 검증**이다.
>
> PR #57/#56/#55/#58/#61/#62/#63/#64/#65 실전 사례를 replay fixture로 사용하여,
> 5 모듈 runtime pipeline이 **사람 개입 없이** decision/evidence/audit을 생성하는지 검증한다.
>
> 정책 문서 작성이 아니라 **자동화 검증 코드**다.
> 본 task 완료 후에야 low-risk live pilot으로 넘어간다.

## 시스템 상태 (회장 명시)

- ✅ **CODE_AUTOMATION_SYSTEM_PHASE_1_COMPLETE** (task-2514 완료, mergeCommit `4f94e1ad`)
- ✅ Critical 7종 발생 0건
- 🟢 본 task = Phase 2 (검증) → low-risk live pilot 진입 전 마지막 게이트

## 5 모듈 runtime + wiring 모두 main (dependency 충족)

- ✅ task-2509.merged (PR #58, merge_queue_executor 본체)
- ✅ task-2509+1.merged (PR #59, review_gate_passed + Gemini 7 enum)
- ✅ task-2509+2.merged (PR #60, automation_contracts.py freeze)
- ✅ task-2510.merged (PR #61, replacement_pr_runner)
- ✅ task-2511.merged (PR #62, auto_gemini_triage)
- ✅ task-2512.merged (PR #64, post_merge_smoke_runner)
- ✅ task-2513.merged (PR #63, critical_escalation_reporter)
- ✅ **task-2514.merged (PR #65, 5 모듈 wiring, mergeCommit `4f94e1ad`)**

## Merge Topology Gate metadata

```yaml
expected_files:
  - "tests/e2e/test_auto_merge_e2e_replay_2515.py"  # NEW: end-to-end replay harness
  - "tests/e2e/fixtures/auto_merge_replay_2515.json"  # NEW: 9 PR replay fixture data

risk_area: "e2e_replay / auto_merge_runtime_verification / live_pilot_gate"

dependency:
  - "task-2509.merged"
  - "task-2509+1.merged"
  - "task-2509+2.merged"
  - "task-2510.merged"
  - "task-2511.merged"
  - "task-2512.merged"
  - "task-2513.merged"
  - "task-2514.merged"

parallel_policy: "serial_only"

merge_queue_position: 12

stale_recheck_required: true

cherry_pick_allowed: false
```

## 실전 replay fixture (회장 명시 — 9 PR)

본 task의 핵심 fixture. 각 PR 사례를 replay 입력으로 사용해 5 모듈 pipeline의 decision/evidence/audit 생성 검증.

| PR | task | 시나리오 |
|---|---|---|
| #57 | task-2503+1 | merge_topology_gate replacement (regex/wrapper false-positive) |
| #56 | task-2506 | base accumulation 117건 + outdated thread + hardcoded path dismiss |
| #55 | task-2507 | clean queue auto-merge + smoke 10/10 PASS |
| #58 | task-2509 | merge_queue_executor 본체 + Gemini quota fallback assumption |
| #61 | task-2510 | required_review_thread_resolution blocker (5 unresolved) |
| #62 | task-2511 | auto_gemini_triage + 4 thread auto-resolve |
| #63 | task-2513 | critical_escalation_reporter 본체 |
| #64 | task-2512 | post_merge_smoke_runner + envelope 패턴 |
| #65 | task-2514 | 5 모듈 wiring + mergeCommit `4f94e1ad` |

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

각 replay fixture에 대해 다음 12 항목을 모두 검증:

1. **queue head 자동 판정**: `merge_topology_gate` ALLOW + `merge_queue_position` 일치
2. **effective diff == expected_files**: `compare_effective_diff` 결과 정확 매칭
3. **forbidden path 0**: `detect_forbidden_paths` 결과 빈 리스트
4. **replacement_pr_runner 분기**: contamination 검출 시 `ReplacementPRRunner.execute()` 호출 검증
5. **auto_gemini_triage 분기**: Gemini thread 존재 시 `triage_pr()` 호출 검증
6. **review thread auto-resolve**: FALSE_POSITIVE / STYLE_ONLY / OUTDATED / CODE_ALREADY_FIXED / MINOR_FIX_ALLOWED 자동 resolve 검증
7. **review_gate_passed**: (Gemini COMPLETED + unresolved 0) OR (UNAVAILABLE + fallback_review_passed) OR (auto_gemini_triage blocking 0) 정확 평가
8. **squash merge decision**: `AUTO_MERGE_ALLOWED` 또는 `BLOCKED_WITH_REASON: <code>` 정확 생성, admin/force/rebase 0
9. **post_merge_smoke_runner 실행**: `PostMergeSmokeRun` envelope 생성 + status (PASS/FAIL/SKIPPED/TIMEOUT) 정확 매칭
10. **후행 PR stale recheck**: BEHIND/conflict/diff 오염/forbidden/Gemini stale 모두 평가
11. **critical_escalation_reporter — Critical 7종만 reportable**: 7 enum exact match, 그 외는 audit only
12. **non-critical은 audit/evidence만**: false-positive/style-only/outdated/clean replacement/dependency satisfied/queue-head auto merge/smoke+stale = `auto-handled` tag로 audit append, 회장 보고 packet 생성 0건

## 필수 replay 시나리오 9건 (회장 §replay)

`tests/e2e/test_auto_merge_e2e_replay_2515.py`:

### 정상 흐름 (4건)
1. **clean auto merge case** — PR #55 (task-2507) replay
   - 5 모듈 chain 통과 → AUTO_MERGE_ALLOWED → squash merge → smoke 10/10 PASS → 후행 stale OK
2. **Gemini false-positive/style-only case** — PR #57 (task-2503+1) + PR #62 (task-2511) replay
   - regex/wrapper false-positive + style-only thread → auto_gemini_triage가 모두 resolve → review_gate_passed
3. **Gemini quota fallback case** — PR #58 (task-2509) replay
   - GEMINI_UNAVAILABLE_QUOTA + fallback_review_passed (8 조건) → review_gate_passed
4. **smoke PASS case** — PR #64 (task-2512) replay
   - post_merge_smoke_runner 실행 → status=PASS + allow_continuation=True → 다음 queue 진행

### Capability gap 회복 (2건)
5. **replacement PR case** — PR #57 contamination 사례 합성
   - effective diff 오염 검출 → replacement_pr_runner가 origin/main 기준 clean branch + expected_files만 이식 → 새 PR queue 선두로 재검증
6. **review thread resolution blocker case** — PR #61 (task-2510) replay
   - 5 unresolved thread → auto_gemini_triage가 모두 OUTDATED/CODE_ALREADY_FIXED 분류 → resolveReviewThread mutation 호출 → mergeStateStatus BLOCKED → CLEAN 전환 검증

### Critical 7종 synthetic (3건)
7. **Critical #7 smoke failure synthetic case**
   - smoke FAIL → critical_escalation_reporter가 `POST_MERGE_SMOKE_FAILED` packet 생성 + 회장 보고 evidence
8. **forbidden path synthetic case**
   - forbidden path 1건 검출 → critical_escalation_reporter가 `FORBIDDEN_PATH_INTRUSION` (#1) + RiskLevel.HIGH_CORE packet
9. **diff contamination synthetic case**
   - replacement 자동 생성 실패 합성 → critical_escalation_reporter가 `REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFF` (#2) packet

## E2E harness 구조

```python
# tests/e2e/test_auto_merge_e2e_replay_2515.py

import json
import pytest
from pathlib import Path

from utils.merge_queue_executor import evaluate_pr  # task-2509 + wiring (task-2514)
from utils.automation_contracts import (
    AutomationDecision, ReviewGateStatus, ReplacementResult,
    SmokeResult, EscalationPacket, CriticalEscalationType, RiskLevel
)

FIXTURE_PATH = Path(__file__).parent / "fixtures" / "auto_merge_replay_2515.json"

@pytest.fixture
def replay_fixtures():
    return json.loads(FIXTURE_PATH.read_text())

# 9 시나리오 × 12 검증 항목 = 108 assertions
```

## CLI entrypoint (선택)

`python3 -m tests.e2e.test_auto_merge_e2e_replay_2515 --pr <N> --replay`
- 단일 PR fixture replay 가능
- 출력: `AutomationDecision` JSON + audit log path

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

- **신규 기능 추가 금지** (5 모듈 본체 + wiring 모두 READ ONLY, import만)
- **5 모듈 본체 수정 금지** (`utils/merge_queue_executor.py` / `replacement_pr_runner.py` / `auto_gemini_triage.py` / `post_merge_smoke_runner.py` / `critical_escalation_reporter.py` / `automation_contracts.py` / `merge_topology_gate.py` 모두 수정 0)
- **dispatch.py 수정 금지**
- **새 abstraction 생성 금지** (helper module / wrapper class / 신규 dataclass 0)
- **enum redesign 금지**
- **contract schema 변경 금지**
- **policy md 보강 금지** (검증 코드만)
- **force push / rebase / admin override / manual .done 금지**
- **required CI bypass 금지**
- **PR #52/#49/#50/#51 수정 금지**
- **expected_files 외 수정 금지** (정확히 2 파일)
- **자동 cherry-pick 구현 금지**
- **live pilot 직접 시도 금지** (본 task = 검증 게이트, live 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/feedback/feedback_critical_escalation_only_260508.md"
    - "utils/automation_contracts.py"          # READ ONLY
    - "utils/merge_queue_executor.py"          # READ ONLY (wired by task-2514)
    - "utils/replacement_pr_runner.py"         # READ ONLY
    - "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/regression/test_*_2509*.py"       # 회귀 보존 검증
    - "tests/regression/test_orchestration_runtime_2514.py"  # task-2514 회귀
    - "memory/orchestration-audit/merge-queue.jsonl"
    - "memory/orchestration-audit/critical-escalations.jsonl"
    - "memory/task-timers.json"
    - ".env.keys"
  paths:
    - "memory/tasks/task-2515*"
    - "memory/reports/task-2515*"
    - "memory/events/task-2515*"
    - "tests/e2e/test_auto_merge_e2e_replay_2515.py"          # NEW
    - "tests/e2e/fixtures/auto_merge_replay_2515.json"        # NEW
  forbidden_actions:
    - "신규 기능 추가"
    - "5 모듈 본체 수정"
    - "dispatch.py 수정"
    - "새 abstraction 생성"
    - "enum redesign"
    - "contract schema 변경"
    - "policy md 보강"
    - "force push"
    - "rebase"
    - "admin override (gh pr merge --admin)"
    - "manual .done 생성"
    - "required CI bypass"
    - "PR #52/#49/#50/#51 수정"
    - "expected_files 외 수정"
    - "자동 cherry-pick 구현"
    - "live pilot 직접 시도"
    - "Critical 7종 외 회장 보고"
    - "amendment 무시 / mid-dispatch correction 무시"
```

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

1. ✅ 실행 가능한 Python 코드 (`tests/e2e/test_auto_merge_e2e_replay_2515.py`)
2. ✅ E2E replay tests PASS (9 시나리오 × 12 검증 = 108 assertions)
3. ✅ **사람 승인/수동 머지 없이 AUTO_MERGE_ALLOWED decision 생성** (★ 핵심 게이트)
4. ✅ Critical 7종 외 회장 보고 0건
5. ✅ **live pilot 후보 1건 선정** (★ 회장 명시) — 다음 회장 보고에서 명시
6. ✅ Merge Topology Gate 자기참조 PASS (effective diff = 정확히 2 파일)
7. ✅ CI 11/11 SUCCESS
8. ✅ 회귀 보존 — 기존 회귀 테스트 모두 PASS (regression suite 0 fail)
9. ✅ amendment 보호 의무 명시 + 적용 evidence

## live pilot 후보 선정 가이드 (회장 §완료조건 #5)

본 task 완료 보고 시 다음 정보를 포함해 live pilot 후보 1건 선정:
- task ID + PR 번호 (예: 다음 작은 코드 변경 task)
- expected_files 정확히 1~2 파일
- forbidden path 0
- 회귀 테스트 정의 명확
- Critical 7종 위험 낮음 (LOW risk_level)
- smoke command 정의됨
- dependency cycle 없음

## 시스템 3문서 참조

- 정책 본체: `memory/feedback/feedback_critical_escalation_only_260508.md`
- 5 모듈 + wiring 위치:
  - `utils/merge_queue_executor.py` (task-2514 wired)
  - `utils/replacement_pr_runner.py` (task-2510)
  - `utils/auto_gemini_triage.py` (task-2511)
  - `utils/post_merge_smoke_runner.py` (task-2512)
  - `utils/critical_escalation_reporter.py` (task-2513)
- 실전 9 PR replay: 본 task fixture

## 후행 (회장 명시)

본 task 완료 = **Phase 2 검증 완료**. 다음 단계:
- low-risk live pilot 1건 (회장 승인 + task-2515 후보 선정 후)
- pilot 성공 시 자동화 시스템 운영 단계 진입
- pilot 실패 시 critical_escalation_reporter packet으로 회장 보고

## affected_files (auto-detected)
- tests/e2e/test_auto_merge_e2e_replay_2515.py (NEW)
- tests/e2e/fixtures/auto_merge_replay_2515.json (NEW)

## goal_assertions (auto-generated)
- `pytest tests/e2e/test_auto_merge_e2e_replay_2515.py -q` → 108/108 assertions PASS
- `pytest tests/regression/ -q` (회귀 보존)
- 보고서에 live pilot 후보 1건 + Critical 7종 0건 명시