# task-2552 — 권장 구현 path (도구 도입 시점/조건/순서)

**범주**: 회장 §명시 산출물 #4
**작성 시각 UTC**: 2026-05-11
**상태**: **회장 정책 결정 대기**. 본 문서는 사전조사 권고이며, 실제 구현 진입은 회장 §명시 후 별도 task로 발행.

---

## 1. 도입 결정 트리

```
[fact #1] bot trigger 100% 실패 (검증 #1, n=15)
   ↓
[fact #2] 우회로 단 1개: OWNER user PAT trigger-only
   ↓
[fact #3] comment-only PAT scope 공식 가능 (검증 #3)
   ↓
[chairman decision dec_1: doctrine 예외 승인?]
   ├─ NO  → 현행 doctrine 유지 (수동 OWNER 개입 지속) — 본 path 종료
   └─ YES → 다음 단계
        ↓
[chairman decision dec_2~5] → 정책 파라미터 확정
   ↓
별도 control-plane Lv.4 task 발행 → 구현
```

---

## 2. 권장 구현 순서 (회장 승인 후)

### Phase 0 — 정책 박제 (구현 전, 1일)

| 단계 | 산출물 |
|---|---|
| 0.1 회장 doctrine 예외 박제 | `memory/policies/owner_pat_trigger_only.md` (회장 §명시 본문) |
| 0.2 PAT 생성 & 저장 (OWNER 직접) | `.env.keys`에 `OWNER_GEMINI_TRIGGER_PAT` (0600) — 기존 BOT_GITHUB_TOKEN과 별도 키 |
| 0.3 PAT 검증 (read-only API call로 권한 확인 — write 금지 검증) | `memory/events/owner_pat_scope_audit.json` |

### Phase 1 — trigger module 구현 (Lv.4 control-plane, 2~3일)

| 단계 | 모듈 | 비고 |
|---|---|---|
| 1.1 sanitize 패턴 추가 | `utils/sanitize_gate.py` — `OWNER_GEMINI_TRIGGER_PAT` 패턴 마스킹 | 기존 `ghs_*` 마스킹 재사용 |
| 1.2 PAT 로딩 helper | `utils/owner_pat_loader.py` (新) — `.env.keys`에서만 로드, env override 금지 | scope 검증 + 만료일 확인 |
| 1.3 trigger function | `utils/gemini_app_trigger.py` (新) | head sha 확정 후 단일 댓글 게시 + dedup + audit log |
| 1.4 dispatch 통합 | `dispatch/` 측에서 `should_trigger_gemini()` 게이트 추가 | bot이 PR open 후 update-branch 완료 + head 확정 시점에만 호출 |
| 1.5 audit log 모듈 | `memory/events/{task}.gemini_trigger_call.jsonl` 생성/append | sanitized only |
| 1.6 fallback ESCALATED | PAT 401/403 시 `BLOCKED — OWNER_PAT_REQUIRED_AUTH_FAIL` | merge gate 차단 doctrine 일관 |

### Phase 2 — QC + 통합 (1~2일)

| 단계 | 검증 |
|---|---|
| 2.1 unit test | `tests/test_owner_pat_loader.py`, `tests/test_gemini_app_trigger.py` |
| 2.2 sanitize regression | `tests/test_sanitize_gate.py`에 PAT 패턴 추가 |
| 2.3 audit cross-check | 1 trigger call → audit log 1 entry → Gemini review 1건 1:1 일치 |
| 2.4 negative test | 만료 PAT, scope 위반 PAT, leak fixture로 sanitize 검증 |
| 2.5 회장 §명시 확인 | doctrine 예외 §명시 본문이 `memory/policies/`에 박제되었는지 |

### Phase 3 — 운영 진입 (canary)

| 단계 | 게이트 |
|---|---|
| 3.1 canary 1건 (bot-opened PR 1건에 한해 trigger) | OWNER 입회 + audit log 직접 검증 |
| 3.2 24h 안정 운영 (bot opened PR 5건 이상) | 100% trigger 성공 확인 |
| 3.3 일반화 (모든 bot-opened PR) | dispatch 게이트 활성화 |
| 3.4 monitor & rotation | D-7/D-1 만료 알림, 90d rotation |

---

## 3. 도입 시점 조건 (Go gate)

다음 **모두 충족** 시 Phase 0 진입:
- [ ] dec_1 PAT doctrine 예외 회장 §명시 승인
- [ ] dec_2 rotation 주기 확정 (권고 90d)
- [ ] dec_3 dedup 정책 확정 (권고 per-head 1회)
- [ ] dec_4 구현 owner 지정
- [ ] dec_5 G4와 양립성 회장 확인

미충족 시: **현행 doctrine 유지** — OWNER 수동 `/gemini review` 댓글 지속.

---

## 4. 미진입 시 baseline 비용

회장이 doctrine 예외 미승인 시:
- bot-opened PR마다 OWNER가 수동 `/gemini review` 댓글 작성
- 검증 #1 24h 데이터: bot-opened PR 8건 중 OWNER가 모두 수동 trigger → 평균 PR당 1.0회 개입 (PR#95, #99 같은 동일 head 재 trigger 사례 일부 존재)
- 일일 OWNER cognitive cost: bot 작업량 비례
- 단 보안/policy 측면 위험 0 — **현재가 보수적이고 안전**

---

## 5. 비-진입 옵션 (대안)

회장이 OWNER PAT 도입을 거부할 경우 가능한 대안:

| 대안 | 가능성 | 비고 |
|---|---|---|
| (A) Gemini CLI를 official merge gate로 격상 | ❌ | 회장 §명시 doctrine 위반 (task-2548 1:1) |
| (B) bot-opened PR 0% 정책 (모든 PR을 OWNER가 open) | 가능 | 자동화 ROI 대폭 감소, 회장 cognitive load 폭증 |
| (C) PR open 직후 OWNER 즉시 trigger 알림 자동화 (Slack 등) | 가능 | trigger는 여전히 OWNER 수동, 알림만 자동 |
| (D) bot이 OWNER에게 trigger 요청 issue를 별도 생성 | 가능 | 추가 noise, ROI 음수 추정 |

권고: **회장이 OWNER PAT 거부 시 (C) 알림 자동화**가 가장 비용 효율적. 별도 task로 검토 가능.

---

## 6. 본 task 종료 후 다음 단계

1. 보고서(`memory/reports/task-2552.md`) 회장 검토
2. 회장 §명시 dec_1~dec_5 결정
3. (승인 시) Lv.4 control-plane task 발행 — 구현
4. (거부 시) 본 path 종료, 대안 (C) 검토 task 별도 발행 가능
