# task-2552 — Gemini App trigger identity probe plan + 결과 종합

**범주**: 회장 §명시 산출물 #1
**작성 시각 UTC**: 2026-05-11
**검증자**: dev1 헤르메스 (사전조사 Lv.1, read-only)

---

## 1. 검증 plan (사전 설계)

| # | 검증 방법 | read-only? | 산출물 | 박제 위치 |
|---|---|---|---|---|
| #1 | PR #91~#100 댓글-trigger timeline audit | ✅ GET API only | timeline JSON | `task-2552.trigger_evidence_audit_24h.json` |
| #2 | GitHub Gemini App 공식 docs 분석 | ✅ WebFetch only | docs 인용 박제 | `task-2552.gemini_app_docs_summary.md` |
| #3 | fine-grained PAT scope 공식 docs 분석 | ✅ WebFetch only | scope 위험 매트릭스 | `task-2552.token_scope_risk_matrix.md` |

**금지 위반 0건**:
- ❌ 신규 댓글 작성 X (검증 #1은 GET만)
- ❌ PAT 생성 X
- ❌ OWNER PAT 사용 X (BOT_GITHUB_TOKEN으로 read-only API call)
- ❌ merge/approve/close/reopen/push X
- ❌ GitHub/Gemini App 설정 변경 X

---

## 2. 검증 #1 결과 (가장 결정적)

**raw evidence**: `task-2552.trigger_evidence_audit_24h.json`

### 2.1 결정적 데이터 포인트

| identity | trigger 시도 | trigger 작동 | 성공률 |
|---|---|---|---|
| **bot** (jeon-jonghyuk-taskctl-bot[bot], `ghs_` installation token) | 5건 | **0건** | **0%** |
| **OWNER user** (JonghyukJeon, User type) | 10건 | **10건** | **100%** |

### 2.2 결정적 사례 (head-to-head 동일 PR)

#### PR #98 (bot opened, open 상태)
- bot `/gemini review` @ 02:23:52Z → Gemini 응답 **없음**
- bot `/gemini review` @ 02:24:16Z → Gemini 응답 **없음**
- OWNER `/gemini review` @ 03:22:16Z → Gemini 응답 @ 03:23:41Z (**+89s**)

#### PR #99 (bot opened, open 상태)
- bot `/gemini review` @ 02:28:40Z → Gemini 응답 **없음**
- OWNER `/gemini review` @ 03:27:07Z → Gemini 응답 @ 03:28:55Z (**+108s**)

→ **동일 PR, 동일 head, 동일 코맨드 텍스트**. 차이는 author identity 단 1건. → 옵션 (b) "OWNER user 댓글만 trigger" **결정적 확정**.

### 2.3 PR open auto-review 분석 (보조 evidence)

| PR | author type | auto-review 작동? |
|---|---|---|
| PR#92 | User (OWNER) | ✅ (Gemini review @ 14:16:45Z) |
| PR#100 | User (OWNER) | ✅ (Gemini review @ 02:40:34Z) |
| PR#91/#93/#94/#95/#96/#97/#98/#99 | Bot | ❌ (8/8 모두 auto-review 없음 — OWNER `/gemini review` 댓글 후에만 응답) |

→ "GEMINI_EXTERNAL_TRIGGER_GAP의 본질 = bot-opened PR auto-review 미작동" 회장 판단 1:1 재확인.

### 2.4 옵션 (a)/(b)/(c) 판정

| 옵션 | 가설 | 판정 |
|---|---|---|
| (a) bot installation token 댓글이 Gemini trigger 작동 | — | **❌ 기각 (5/5 실패)** |
| (b) OWNER user identity 댓글만 trigger | — | **✅ 확정 (10/10 성공, head-to-head)** |
| (c) keyword만 매칭하면 trigger | — | ❌ 기각 (bot 댓글도 정확히 `/gemini review` 텍스트인데 0건 작동) |

---

## 3. 검증 #2 결과 (공식 docs)

**상세**: `task-2552.gemini_app_docs_summary.md`

요약:
- 공식 docs는 "any pull request contributor"라고만 명시. bot/User 차별 **명시 X**.
- GitHub의 GITHUB_TOKEN 룰 ("workflow run 트리거 X")이 Gemini App에 직접 적용된다는 statement는 **없음**.
- 그러나 Gemini App이 자체 webhook 핸들러에서 `sender.type == "Bot"` 필터를 두는 것은 산업 표준 패턴 (recursive 방지).
- 결론: **공식 docs로는 trigger gap 원인 확정 불가**. 단 trigger gap 자체는 검증 #1로 100% 확정.

---

## 4. 검증 #3 결과 (PAT scope)

**상세**: `task-2552.token_scope_risk_matrix.md`

요약:
- comment-only fine-grained PAT 가능 (Issues:write 단독)
- merge/approve/close/reopen/push/branch-protection-bypass **전부 차단 가능** (0%)
- 잔여 위험: PAT 평문 노출, rotation 누락, log leak, OWNER 계정 자체 침해 — 모두 운영 정책으로 mitigate

---

## 5. 결론 종합

| 질문 | 답변 |
|---|---|
| 어떤 identity가 trigger 작동? | OWNER user (User type) **단독** |
| bot installation token 댓글로 trigger 가능? | ❌ 불가 (검증 #1 결정적) |
| keyword-only 매칭? | ❌ 아님 (검증 #1) |
| comment-only PAT scope 가능? | ✅ 가능 (검증 #3) |
| 공식 docs trigger 조건 명문화? | ❌ 부분 명문화 (any contributor 언급) — 실증과 모순 |
| OWNER PAT 도입 외 우회로 존재? | ❌ 없음 (Gemini App 설정 변경은 Google 정책 한계 — 검토 대상 #4) |

**핵심 발견**: 검토 대상 5개 중,
- (1) Fine-grained OWNER PAT trigger-only — **유일한 실용 옵션**
- (2) GitHub App comment-only token — **불가** (다른 App 설치 시에도 sender.type == "Bot"으로 분류 → 같은 문제 회귀, 검증 #1 1:1 적용 가능)
- (3) BOT_GITHUB_TOKEN comment 방식이 trigger됨 — **❌ 결정적 기각** (옵션 도입 자체 불필요는 아님 — 우회 필요)
- (4) Gemini App 설정 변경 — Google 정책 한계 추정, 본 task에서 변경 시도 X
- (5) Gemini CLI 대체 — doctrine상 제외 (회장 §명시)

**회장 정책 결정 필요**: OWNER PAT 도입을 doctrine 예외로 승인할지 (산출물 #2 `owner_trigger_policy_decision.json`).
