# owner_gemini_trigger_router fixtures (task-2641 Track A)

회장 verbatim 12 (2026-05-23) 1:1 박제 — OWNER_GEMINI_TRIGGER_UI_FALLBACK_MISROUTE
재발 방지 router 검증용 6 시나리오 × 3 file (evidence/expected/PROVENANCE) = 18 file.

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

1. **pr_review_empty_body_misroute_block** — PR Review (state=COMMENTED, body="") 오인식 차단 → `NOT_GEMINI_TRIGGER` (task-2640 사고 박제, 회장 review id=4350214991)
2. **issue_comment_exact_body_trigger_success** — issue_comment body="/gemini review" → STALE → POSTED → fresh review 도착 → `FRESH`
3. **permission_403_diagnostics_record** — 403 → X-Accepted-GitHub-Permissions / X-Accepted-OAuth-Scopes / X-OAuth-Scopes / X-RateLimit-Remaining 기록 + raw token redact → `NUDGE_PERMISSION_DENIED`
4. **nudge_limit_exceeded_dedupe** — prior audit nudge_attempted=true 가 있는 (pr, head) 2회째 호출 → `NUDGE_DEDUPED` (실 POST 0)
5. **fresh_review_arrives_within_timeout** — 초기 freshness 이미 FRESH → action 0 → `FRESH`
6. **stale_after_nudge_timeout_classify** — POSTED 후 fresh review 미도착 polling 끝 → `GEMINI_EXTERNAL_TRIGGER_STALE`

각 디렉토리:
- `evidence.json` — router 호출 입력 + 시나리오 simulation 데이터 (정본)
- `expected.json` — final_state / freshness_state / audit 핵심 필드 기대값
- `PROVENANCE.md` — 시나리오 정합성 / 회장 verbatim 매핑 / 출처

## 회장 verbatim 12 매핑

| verbatim | 시나리오 |
|----------|----------|
| §1, §2 PR Review ≠ trigger | pr_review_empty_body_misroute_block |
| §3 PR-backed issue comment body="/gemini review" only | issue_comment_exact_body_trigger_success |
| §4, §11 OWNER nudge 1차 + UI fallback 최후 | permission_403_diagnostics_record |
| §6 raw token 출력 금지 | permission_403_diagnostics_record (sentinel redact 검증) |
| §8 403 header 기록 | permission_403_diagnostics_record |
| §9 nudge 1회 hard limit | nudge_limit_exceeded_dedupe |
| §10 GEMINI_EXTERNAL_TRIGGER_STALE 분류 | stale_after_nudge_timeout_classify |
| §12 재발 방지 fixture | pr_review_empty_body_misroute_block (task-2640 사고) |
