# ci_watch_handoff_runner fixtures (task-2642)

회장 verbatim (2026-05-23 19:38 KST) 1:1 박제 — ANU 직접 CI/Gemini 대기 금지 정책 코드화.
CI_WATCH_HANDOFF_RUNNER state machine 검증용 6 시나리오 × 3 file (evidence/expected/PROVENANCE) = 18 file.

## 시나리오 목록 (spec §5)

1. **merge_ready_clean_gemini_fresh** — CI 11/11 PASS + Gemini fresh + 0 unresolved + CLEAN → `MERGE_READY`
2. **gemini_stale_nudge_posted_re_poll_fresh** — 1차 router NUDGE_POSTED → re-poll → FRESH 도착 → `MERGE_READY`
3. **gemini_stale_after_nudge_timeout** — OWNER nudge 1회 hard limit 후 timeout → `GEMINI_EXTERNAL_TRIGGER_STALE`
4. **ci_failure_auto_remediation_medium_fix** — CI FAIL (medium · expected_files 내부) → auto_remediation APPLIED → CI PASS → `MERGE_READY`
5. **forbidden_path_modification_detected** — ci_snap.forbidden_path_touched=True → 즉시 `CHAIR_REQUIRED` (Critical7)
6. **loop_boundary_three_high_attempts** — same-function HIGH 반복 + attempts>=3 → `LOOP_BOUNDARY`

각 디렉토리:
- `evidence.json` — runner 호출 입력 + ci_status_sequence + router_call_sequence + auto_remediation_outcome_sequence
- `expected.json` — terminal_state / router_final_state / ci_status / audit event sequence
- `PROVENANCE.md` — 시나리오 정합성 / 회장 verbatim 매핑 / 출처

## 회장 verbatim 5 terminal_states 매핑

| terminal_state | 시나리오 |
|----------------|----------|
| MERGE_READY | merge_ready_clean_gemini_fresh, gemini_stale_nudge_posted_re_poll_fresh, ci_failure_auto_remediation_medium_fix |
| CHAIR_REQUIRED | forbidden_path_modification_detected |
| GEMINI_EXTERNAL_TRIGGER_STALE | gemini_stale_after_nudge_timeout |
| CI_FAILED_NON_REMEDIABLE | (regression test 에서 NON_REMEDIABLE outcome 으로 직접 검증) |
| LOOP_BOUNDARY | loop_boundary_three_high_attempts |

## PR #144 OWNER_GEMINI_TRIGGER_ROUTER stack 정합 (무수정)

router final_state 8종 → runner terminal_states 5종 매핑 (spec §4 + ANCHOR-2 of runner):
- `FRESH` → polling 후 MERGE_READY 분기
- `NUDGE_POSTED` / `NUDGE_DEDUPED` → polling continue (다음 tick)
- `GEMINI_EXTERNAL_TRIGGER_STALE` → 동명 terminal
- `CHAIR_UI_FALLBACK_REQUIRED` / `NUDGE_PERMISSION_DENIED` / `NUDGE_FAILED` / `NOT_GEMINI_TRIGGER` → CHAIR_REQUIRED
