# Checklist: task-2565 / GEMINI_SECOND_REVIEW_BOTTLENECK

## Phase 1 — Schema + Policy 상수

### 구현
- [x] `anu_v2/second_review_recovery.py` 신규 골격 작성
- [x] `anu_v2/polling_policy.py`에 상수 추가:
  - [x] `SECOND_REVIEW_GRACE_SECONDS = 180`
  - [x] `MAX_SECOND_REVIEW_RECHECKS = 1`
  - [x] `LONG_POLLING_FORBIDDEN = True`
  - [x] `SECOND_REVIEW_OWNER_TRIGGER_DEDUPE_KEY = "pr_number+head_sha"`
- [x] 9 상태 enum 정의 (FOLLOW_UP_COMMIT_CREATED ~ MERGE_READY_AFTER_SECOND_REVIEW)
- [x] `second_review_decision.v1` schema (12 필드) 정의
- [x] `pre_merge_commit_decision.v1` schema (6 필드) 정의

### Tests (Phase 1)
- [x] `test_second_review_decision_schema_validation`
- [x] `test_pre_merge_commit_decision_schema_validation`
- [x] `test_state_enum_serialization`
- [x] `test_long_polling_forbidden_constant`
- [x] `test_grace_default_180s`
- [x] `test_max_recheck_default_1`

### Phase 1 Gate
- [x] tests PASS
- [x] expected_files strict (5 파일 한정)
- [x] forbidden path 0
- [x] `memory/events/task-2565.phase-1.schema-policy.done` 생성

---

## Phase 2 — Stale Detection + Owner Trigger 자동 호출

### 구현 8단계
- [x] 1. follow-up commit 후 current head vs latest Gemini commit_id 비교 로직
- [x] 2. mismatch 시 `GEMINI_STALE_ON_HEAD_AFTER_FOLLOW_UP` 분류
- [x] 3. `SECOND_REVIEW_PENDING` marker 생성
- [x] 4. 180초 grace 후 `SECOND_REVIEW_TRIGGER_REQUIRED` 전이
- [x] 5. `owner_trigger_only` runner 자동 호출 (capability 재사용)
- [x] 6. same-head DEDUPED 확인 (`owner_trigger_audit.jsonl` 조회)
- [x] 7. 7 marker 파일 생성 로직
- [x] 8. `owner_trigger_audit.jsonl` append

### 7 Marker 파일
- [x] `memory/events/task-2565.second-review-decision.json`
- [x] `memory/events/task-2565.gemini-stale-on-head-after-followup`
- [x] `memory/events/task-2565.second-review-owner-trigger-requested`
- [x] `memory/events/task-2565.second-review-owner-trigger-posted`
- [x] `memory/events/task-2565.second-review-fresh-detected`
- [x] `memory/events/task-2565.ci-rerun-after-fresh`
- [x] `memory/events/task-2565.merge-ready-after-second-review`

### Fixture #1 (dev6 case)
- [x] `anu_v2/fixtures/gemini_second_review_bottleneck/dev6_old_gemini_sha.json`
- [x] old SHA `d251399c` / follow-up `cee55afe` / CI stale fail
- [x] expected: owner_trigger_only auto call

### Tests (Phase 2)
- [x] `test_follow_up_commit_marks_gemini_stale_on_head`
- [x] `test_second_review_owner_trigger_called_after_grace`
- [x] `test_same_head_duplicate_owner_trigger_deduped`

### Phase 2 Gate
- [x] tests PASS
- [x] expected_files strict
- [x] forbidden path 0
- [x] `memory/events/task-2565.phase-2.owner-trigger.done` 생성

---

## Phase 3 — CI rerun + MERGE_READY pre-merge guard

### CI rerun 자동화
- [x] fresh evidence on current head + stale reason + head unchanged 조건 감지
- [x] failed CI jobs rerun 호출
- [x] CI 11/11 SUCCESS 확인
- [x] `merge_queue_decision` 갱신
- [x] rerun marker 생성

### CI rerun 금지 (assertion)
- [x] fresh evidence 없이 CI rerun 반복 금지 (test로 검증)
- [x] same failed job 무한 rerun 금지 (cap 적용)
- [x] long polling 금지

### MERGE_READY pre-merge commit 차단
- [x] merge_ready 5조건 판정 함수
- [x] 차단 대상 5종 분류 함수 (report wording / QC Verdict wording / lifecycle marker wording / non-functional summary / evidence text 보강)
- [x] `BLOCK_PRE_MERGE_REPORT_ONLY_COMMIT` decision 생성
- [x] `pre_merge_commit_decision.v1` 생성 (`memory/events/task-2565.pre-merge-commit-decision.json`)
- [x] post-merge evidence redirect 로직

### Primary / Secondary
- [x] Primary: push 직전 executor guard / merge_queue_executor guard 구현
- [x] Secondary: pre-commit hook은 optional 또는 dry-run evidence 수준만 (구현 시)

### Fixture #2 (dev5 case) + Fixture #3 (race case)
- [x] `anu_v2/fixtures/gemini_second_review_bottleneck/dev5_merge_ready_report_only.json`
  - expected: `BLOCK_PRE_MERGE_REPORT_ONLY_COMMIT`
- [x] `anu_v2/fixtures/gemini_second_review_bottleneck/race_fresh_after_ci_fail.json`
  - expected: CI rerun after fresh evidence

### Tests (Phase 3)
- [x] `test_fresh_evidence_after_ci_failure_reruns_failed_jobs`
- [x] `test_merge_ready_report_only_commit_blocked`
- [x] `test_post_merge_evidence_redirect_allowed`
- [x] `test_stale_ci_merge_forbidden`

### Phase 3 Gate
- [x] tests PASS
- [x] merge_ready report-only commit 차단 증거 (decision.json)
- [x] CI rerun loop 방지 증거 (cap 적용 test PASS)
- [x] `memory/events/task-2565.phase-3.ci-rerun-premerge-guard.done` 생성

---

## Phase 4 — Integration + BOT squash merge

### 구현 7항목
- [ ] expected_files strict
- [ ] forbidden path 0
- [ ] CI/Gemini/CLEAN 확인
- [ ] BOT squash merge (`app/jeon-jonghyuk-taskctl-bot`)
- [ ] post-merge smoke
- [ ] reconcile evidence
- [ ] 완료 조건 12항목 전수 검증

### 필수 산출 파일
- [ ] `second_review_decision.json`
- [ ] `pre_merge_commit_decision.json`
- [ ] `owner_trigger_audit.jsonl` append
- [ ] CI rerun evidence
- [ ] `merge_queue_decision` update
- [ ] post-merge smoke evidence
- [ ] reconcile evidence
- [ ] `.done` / `.done.acked` / `merge-done`

### Phase 4 Gate
- [ ] PR merged by `app/jeon-jonghyuk-taskctl-bot`
- [ ] admin override 0
- [ ] force / rebase 0
- [ ] 회장 수동 `/gemini review` 0
- [ ] post-merge smoke PASS
- [ ] reconcile PASS
- [ ] `memory/events/task-2565.phase-4.integration-merge.done` 생성

---

## 완료 조건 12 매핑

| # | 조건 | Phase | 검증 |
|---|------|-------|------|
| 1 | second-review decision schema 생성 | P1 | Phase 1 schema test |
| 2 | follow-up commit 후 stale Gemini 자동 감지 | P2 | `test_follow_up_commit_marks_gemini_stale_on_head` |
| 3 | owner_trigger_only 자동 호출 또는 dedupe | P2 | `test_second_review_owner_trigger_called_after_grace` + `test_same_head_duplicate_owner_trigger_deduped` |
| 4 | fresh evidence 도착 후 CI rerun 자동화 | P3 | `test_fresh_evidence_after_ci_failure_reruns_failed_jobs` |
| 5 | merge-ready report-only commit 차단 | P3 | `test_merge_ready_report_only_commit_blocked` |
| 6 | regression fixture 3종 추가 | P2-P3 | 3 fixture 파일 존재 |
| 7 | tests PASS | P1-P3 | 전 tests green |
| 8 | expected_files strict | P4 | diff == expected_files |
| 9 | forbidden path 0 | P4 | forbidden scan 0 |
| 10 | CI/Gemini/CLEAN | P4 | gh pr view 확인 |
| 11 | BOT squash merge | P4 | mergedBy = `app/jeon-jonghyuk-taskctl-bot` |
| 12 | post-merge smoke + reconcile evidence | P4 | smoke·reconcile marker |

---

## Critical Escalation 조건 (회장 보고 트리거)

다음 발생 시 즉시 회장 보고 + 다음 Phase 진행 금지:
- [ ] `owner_trigger_only` POST 실패
- [ ] token boundary violation
- [ ] fresh review 후 real bug가 expected_files 밖 수정 요구
- [ ] forbidden path 요구
- [ ] follow-up commit cap 초과
- [ ] CI rerun 반복 실패 (cap 초과)
- [ ] post-merge smoke failure
- [ ] taskctl / silent_corruption_guard checksum mismatch 상태에서 merge 우회 시도 (Critical 7 #4 candidate)

## STATE_INTEGRITY_BLOCKED 처리 (본 task 범위 밖, 감지 시 차단)

- [ ] main workspace task scope 밖 변경 stash 감지 시 `merge_queue_decision=BLOCKED`
- [ ] silent_corruption_guard vs taskctl checksum 불일치 감지 시 MERGE_HOLD
- [ ] 이미 merged 상태 감지 시 POST_MERGE_INTEGRITY_AUDIT_REQUIRED
- [ ] 회장 보고 (Critical 7 #4 candidate)
