# task-2520 — low-risk live pilot (5 모듈 자동화 end-to-end 실전 검증)

- 작업 유형: **live pilot — 회귀 테스트 1 파일 추가 + 자동화 파이프라인 사람 개입 0 검증**
- 작업 레벨: **Lv.1** (test-only 작성)
- 우선순위: **★★ P1**
- Track: **live_pilot / phase2_p2 / 5_module_automation_validation**
- parallel_policy: **serial_only**
- 일시: 2026-05-09
- 회장 결정: 2026-05-09 — 후보 3개 중 1번 (test-only) 선택, task-2520-A로 발행

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

> task-2520은 기능 개발 task가 아니라 **live pilot**이다.
> 목표는 "코드 더 만들기"가 아니라, **이미 구현된 자동화 시스템이 실제 low-risk PR을 사람 개입 없이 처리하는지 검증**하는 것.
>
> 회장 직접 머지 요청 금지. 자동화가 가능한 경우 자동 처리. Critical 7종 외 장문 보고 금지.

## 시스템 상태

- ✅ **CODE_AUTOMATION_SYSTEM_PHASE_1_COMPLETE** + Phase 2 P0 (task-2517) + P1 (task-2518/2519)
- ✅ task-2518 PR #70 AUTO_MERGE_SUCCESS (mergeCommit `257fd5259e8e17d2b02a9cc5aa73f4d3670a3bdb`)
- ✅ lifecycle_reconciliation_manager --apply PASS, evidence-based 백필 완료
- 🟢 **Phase 2 P2 진입 — task-2520 = 자동화 시스템의 첫 라이브 작동 시험**

## dependency (모두 충족)

- ✅ task-2509.merged (5 모듈 본체)
- ✅ task-2509+2.merged (automation_contracts.py)
- ✅ task-2511.merged (auto_gemini_triage)
- ✅ task-2512.merged (post_merge_smoke_runner)
- ✅ task-2513.merged (critical_escalation_reporter)
- ✅ task-2514.merged (5 모듈 wiring)
- ✅ task-2515.merged (e2e replay harness)
- ✅ task-2516+1.merged (W1 default 활성화)
- ✅ task-2517.merged (canonical_workspace_resolver)
- ✅ task-2518.merged (lifecycle_reconciliation_manager, mergeCommit `257fd525`)
- ✅ task-2519.merged (repository_policy_adapter)

## Merge Topology Gate metadata

```yaml
expected_files:
  - "tests/regression/test_lifecycle_reconciliation_manager_2518.py"  # MODIFY (현 14건 → 15건)

risk_area: "live_pilot / regression_coverage / bot_session_cancelled_replay"

dependency:
  - "task-2509.merged"
  - "task-2509+2.merged"
  - "task-2511.merged"
  - "task-2514.merged"
  - "task-2517.merged"
  - "task-2518.merged"
  - "task-2519.merged"

parallel_policy: "serial_only"

merge_queue_position: 18

stale_recheck_required: true

cherry_pick_allowed: false
```

## 1단계 — 회귀 테스트 1건 추가 (코드 작성 영역)

`tests/regression/test_lifecycle_reconciliation_manager_2518.py`에 **신규 테스트 1건** 추가:

### 테스트 시나리오

**시나리오명**: `test_bot_session_cancelled_with_evidence_intact_replay`

**의도**: task-2518 self-host에서 자체 발견된 한계점 박제. 다그다 hang 사례를 회귀로 보존.

**fixture 조건** (mock evidence):
- `bot_session_status = "cancelled"` (cron status로 캡처된 봇 종료 흔적)
- `timer_status = "running"` (timer 미정지)
- worktree exists + branch_pushed_to_remote = True
- pr_number = None (PR 미생성)
- has_done = False
- pytest/L1 smoke evidence 정상 (commits 5건 가정)

**assertion** (현 본체 동작 검증):
- `state` ∈ {`STUCK_NEEDS_RECONCILE`} 또는 `RUNNING` 중 본체가 어떻게 분류하는지 정확 박제
- `stuck_cases`에 `FINISH_TASK_INTERRUPTED` 포함 여부 (현 본체에선 worktree+branch+no_pr 매칭으로 포함)
- `bot_session_status=cancelled` 단독 case가 stuck reason으로 격상되지 않음을 명시 (현 본체 한계점 회귀로 박제 — task-2521 hardening 영역에서 격상 예정)
- `actions_planned`에 `MANUAL_DONE_FORGERY_BLOCKED` 또는 `BLOCKED (insufficient evidence)` 포함

**하지 말 것**:
- 본체 (`utils/lifecycle_reconciliation_manager.py`) 수정 금지
- 새 stuck reason enum 추가 금지 (operational hardening = task-2521)
- automation_contracts 변경 금지

회귀가 현 본체 동작을 그대로 박제하는지가 목표. 본체 변경 시 회귀 깨지도록 작성.

## 2단계 — 자동화 파이프라인 12-step 진입 (사람 개입 0)

작업자(봇)는 1단계 commit + branch push까지만 수행. 그 후엔 5 모듈 자동화가 처리:

1. ✅ Dispatch Topology Gate 통과 (expected_files=1 매칭)
2. ✅ PR 생성
3. ✅ CI / Gemini / review_gate 자동 처리
4. ✅ false-positive / style-only / outdated / code-fixed thread 자동 처리 (auto_gemini_triage)
5. ✅ mergeStateStatus CLEAN 확인
6. ✅ HEAD SHA lock 확인
7. ✅ 자동 squash merge (10조건 PASS 시)
8. ✅ post-merge smoke 실행 (`pytest tests/regression/test_lifecycle_reconciliation_manager_2518.py -q`)
9. ✅ `python3 utils/lifecycle_reconciliation_manager.py --task-id task-2520 --reconcile --apply`
10. ✅ 후행 stale 재검증
11. ✅ Critical 7종 외 회장 보고 0건

**핵심**: 위 단계 중 사람/봇이 개입해야 하는 case 발생 시 → 그 자체가 회장 §명시 Critical 7종 분류 대상.

## 자동 머지 10조건 (검증 대상)

1. PR state OPEN
2. effective diff = expected_files (정확히 1 파일)
3. force-push 0
4. CI 11/11 SUCCESS
5. mergeStateStatus = CLEAN
6. Critical 7종 0건
7. branch behind main = false
8. unresolved review thread = 0
9. required approval 충족 (또는 capability gap 없음)
10. dependency 충족

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

- ❌ **utils/lifecycle_reconciliation_manager.py 본체 수정 금지** (본 task = test-only)
- ❌ **dispatch.py 수정 금지**
- ❌ **automation_contracts 변경 금지**
- ❌ **merge_queue_executor 변경 금지**
- ❌ **5 모듈 본체 수정 금지** (auto_gemini_triage / post_merge_smoke_runner / critical_escalation_reporter / replacement_pr_runner / merge_queue_executor)
- ❌ **canonical_workspace_resolver 수정 금지**
- ❌ **repository ruleset 변경 금지**
- ❌ **DB/schema migration 금지**
- ❌ **PR #52/#49/#50/#51 수정 금지**
- ❌ **expected_files 외 수정 금지** (정확히 1 파일)
- ❌ **자동 cherry-pick 구현 금지**
- ❌ **새 모듈 / 새 abstraction 생성 금지**
- ❌ **enum / contract schema 변경 금지** (새 stuck reason 추가 X — task-2521 영역)
- ❌ **force push / rebase / admin override / manual `.done` 금지**
- ❌ **required CI bypass 금지**
- ❌ **회장 직접 머지 요청 금지**
- ❌ **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/tasks/task-2517*"
    - "memory/tasks/task-2518*"
    - "memory/tasks/task-2519*"
    - "memory/tasks/task-2520*"
    - "memory/feedback/feedback_critical_escalation_only_260508.md"
    - "utils/automation_contracts.py"            # READ ONLY
    - "utils/canonical_workspace_resolver.py"    # READ ONLY
    - "utils/lifecycle_reconciliation_manager.py"  # READ ONLY (본 task = 본체 수정 금지)
    - "utils/repository_policy_adapter.py"       # READ ONLY
    - "utils/merge_queue_executor.py"            # READ ONLY
    - "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
    - "memory/orchestration-audit/merge-queue.jsonl"
    - "memory/task-timers.json"
    - ".env.keys"
  paths:
    - "memory/tasks/task-2520*"
    - "memory/reports/task-2520*"
    - "memory/events/task-2520*"
    - "tests/regression/test_lifecycle_reconciliation_manager_2518.py"  # ★ MODIFY (회귀 1건 추가)
  forbidden_actions:
    - "utils/lifecycle_reconciliation_manager.py 본체 수정"
    - "dispatch.py 수정"
    - "automation_contracts 변경"
    - "merge_queue_executor 변경"
    - "5 모듈 본체 수정"
    - "canonical_workspace_resolver 수정"
    - "repository ruleset 변경"
    - "DB/schema migration"
    - "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 변경"
    - "회장 직접 머지 요청"
    - "Critical 7종 외 회장 보고"
    - "amendment 무시 / mid-dispatch correction 무시"
```

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

```
task-2520 LIVE_PILOT_SUCCESS — mergeCommit <sha>, smoke PASS, reconcile PASS, Critical 7종 0건.
```

위 한 줄이면 충분. 그 외 장문 보고 금지.

## Critical 보고 조건 (7종 외 보고 금지)

1. forbidden path 침범
2. effective diff 오염 중 replacement PR 자동 생성 실패
3. Gemini real bug가 expected_files 밖 수정 또는 scope 확장을 요구 (`GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSION`)
4. BLOCK override 필요 또는 override reason 불충분
5. dependency cycle / serial_only 충돌
6. replacement PR도 실패
7. post-merge smoke 실패

## 후행

본 task LIVE_PILOT_SUCCESS 후:
- **task-2521** — operational hardening (lifecycle/repository policy 운영 반영, 특히 `bot_session_status=cancelled+timer_running+pr_missing` 별도 stuck case 격상)
- **task-2522** — observability / dashboard

## affected_files
- tests/regression/test_lifecycle_reconciliation_manager_2518.py (modify, 회귀 14 → 15)
