# task-2542 — GEMINI_EXTERNAL_TRIGGER_GAP root cause 조사 (read-only research, code 변경 X)

- 작업 유형: **read-only research / report-only / analysis-only / finalize_policy:no_pr** (4 opt-out 토큰 명시 — finalize 14단계 면제)
- 작업 레벨: **Lv.4** (외부 시스템 분석 + 9개 조사 범위 + 사례 비교 + 대체 트리거 가능성 검토)
- 우선순위: **★★ blocking** (회장 §결정 2026-05-10 / EXTERNAL_TRIGGER_REQUIRED operational nudge 거부 후 root cause 승격)
- Track: **gemini_trigger_gap_root_cause_investigation**
- parallel_policy: **parallel_safe** (코드 변경 0 / merge 0 / read-only)
- 일시: 2026-05-10
- 회장 결정: 2026-05-10 — operational nudge 처리 거부, 근본 원인 조사 승격

## ⚠️ 본 task의 본질 — 회장 §명시

> **회장 §명령(2026-05-10, PR #86 stuck 후)**:
> EXTERNAL_TRIGGER_REQUIRED operational nudge로 처리하지 않는다.
> GEMINI_EXTERNAL_TRIGGER_GAP을 **근본 조사 대상으로 승격**한다.
>
> task-2537은 replacement_pr_runner 본질 작업 실패가 아니므로 폐기하지 않는다.
> 다만 Gemini trigger root cause 확인될 때까지 PR #86 merge finalize는 보류한다.
> 마찬가지로 PR #87 task-2538도 동일 패턴이라 동일 보류 권고.

## 사례 누적 (audit 정합)

| PR | task | 봇 | merge 결과 | 회복 경로 |
|---|---|---|---|---|
| #75 | task-2526 | dev4 비슈누 | MERGED | 회장 인간 코멘트 1회 |
| #83 | task-2534 | dev5 마르둑 | MERGED | 회장 인간 코멘트 1회 |
| #86 | task-2537 | dev4 비슈누 | OPEN_HOLD | **본 조사 결과 대기 중** |
| #87 | task-2538 | dev7 이참나 | OPEN_HOLD | **본 조사 결과 대기 중** |

→ 누적 4건 / manual recovery burden 누적 / 자동화 불가 시 nudge 최후수단 + audit 누적 명시.

## 조사 범위 9건 (회장 §명시 그대로)

### 1. Gemini Code Assist App 트리거 이벤트 식별
- App marketplace listing / official docs 확인
- 어떤 GitHub event가 review를 트리거하는지 (pull_request opened/synchronize/reopened, issue_comment created, label added 등)
- 자동 review vs on-demand review 분리

### 2. 인간 계정 vs bot account comment 차이
- comment author.type 필드 (User vs Bot)
- App-installed comment의 author 표시
- Gemini 측 author whitelist / blacklist 검증

### 3. `/gemini review` comment author 조건
- Gemini가 comment를 trigger로 인식할 때 author 권한 확인 (collaborator / author / maintainer 등)
- bot identity comment의 무효 사유 (App 자체 author 인식 + self-trigger 회피)

### 4. GitHub App 권한 / installation permission
- jeon-jonghyuk-taskctl-bot App의 installation permissions 확인
- pull_request:write / issues:write 등 comment 발행 권한 충분한지
- 그러나 권한 ≠ Gemini trigger 자격 (분리)

### 5. GitHub Webhook 이벤트 조건
- pull_request (opened/synchronize/reopened/labeled)
- issue_comment (created)
- workflow_run (completed)
- check_suite (completed/rerequested)
- 각 event 별 Gemini App subscription 여부 + filter

### 6. branch BEHIND 상태에서 Gemini 리뷰 생략 여부
- 본 batch 4건 모두 BEHIND main 상태에서 발생
- BEHIND가 trigger filter 조건일 가능성 검증
- merge origin/main 후 push 시 새 commit_id에 대한 자동 review 여부

### 7. PR #75 / #83 / #86 / #87 사례 비교
- PR 생성 시각 / 마지막 push 시각 / Gemini 첫 리뷰 시각 / 회복 시각
- BEHIND 발생 시점 / 봇 push 시점 / Gemini 재리뷰 시점
- 4 case 사이 공통점 / 차이점 표 작성

### 8. bot이 가능한 대체 트리거 검증
- (a) **label 추가** — `gemini-rerun` 등 라벨로 trigger 가능?
- (b) **workflow_dispatch** — Actions workflow 수동 트리거 (Gemini App과 연결?)
- (c) **check rerun** — failed check rerun으로 Gemini 재실행?
- (d) **empty commit** — 절대 금지 (룰 위반 / fictitious change)
- (e) **issue_comment via bot** — `/gemini review` bot 발행 (이미 무효 확인)
- (f) **app token vs installation token** — token type에 따른 author 변경 가능 여부

### 9. 자동화 불가 시 처리
- nudge를 최후수단으로 유지 (operational nudge 모듈 task-2540 spec 그대로 박제)
- 반복 발생 횟수 audit 누적: `memory/orchestration-audit/gemini-trigger-gap-260510.jsonl`
- manual burden minutes 누적
- 24h period당 발생 횟수가 임계 (예: 3건 이상) 초과 시 별도 escalation

## 시스템 상태

- ✅ task-2531 merge_queue_executor v0 MERGED
- 🟡 task-2537 replacement_pr_runner — **OPEN_HOLD (PR #86)** — 본 조사 대기
- 🟡 task-2538 auto_gemini_triage v0 — **OPEN_HOLD (PR #87)** — 본 조사 대기
- 🟢 task-2538+1 / task-2540 / task-2541 — task md 작성 완료, 발사 보류 (의존 chain 영향)
- 🟢 task-2539 — 미발행 (dependency chain 영향)
- 🟢 본 task = root cause investigation, **위 모든 chain의 진입 게이트**

## dependency

- **선행 의존 없음** (read-only research)
- 본 task 결과가 task-2537/2538 finalize 보류 해제 / task-2538+1/2540/2541 발사 정합성 결정

## Merge Topology Gate metadata

```yaml
expected_files:
  - "memory/reports/task-2542.md"  # NEW (조사 보고서)
  - "memory/orchestration-audit/gemini-trigger-gap-260510.jsonl"  # APPEND (case 비교 박제)

risk_area: "research_only / no_code_change / read_only"

dependency: []

parallel_policy: "parallel_safe"

merge_queue_position: 49

stale_recheck_required: false

cherry_pick_allowed: false

opt_out_tokens:
  - "read_only"
  - "report_only"
  - "analysis_only"
  - "finalize_policy:no_pr"
```

## 위임 후보 (회장 승인 대기)

- **consulting-team** (1순위) — research / policy / external system audit 적합
- **composite-team** (2순위) — 횡단 조직 agent ③ 카테고리 (외부 + 코드 + 거버넌스 + boris workflow)
- **anu-direct** (3순위) — 직접 코딩 금지 룰 영향 0 (research only)

## 회장 §명시 절대 금지

- ❌ **코드 변경** (research only)
- ❌ **PR 생성** (finalize_policy:no_pr)
- ❌ **머지** (read-only)
- ❌ **회복 nudge 발송** (operational nudge 거부)
- ❌ **PR #86 / PR #87 인간 계정 트리거** (회장 §명시 거부)
- ❌ **GitHub App 권한 변경 / installation 변경** (read-only)
- ❌ **empty commit** (fictitious change 금지)
- ❌ owner_pat / 회장 직접 머지 / admin override / force / rebase / manual `.done` / `--session`

## 완료 조건 (보고서 작성 완료 시)

1. ✅ 9개 조사 범위 모두 답변 (각 항목별 finding + evidence URL/cite)
2. ✅ PR #75/#83/#86/#87 사례 비교 표 (시간선 + 공통점/차이점)
3. ✅ 대체 트리거 8 후보 각 검증 결과 (가능/불가/조건부)
4. ✅ 자동화 가능 → 구현 권고 task 번호 명시
5. ✅ 자동화 불가 → nudge 최후수단 유지 + audit 임계 정의
6. ✅ task-2537/2538 finalize 보류 해제 권고 (또는 추가 보류 사유)
7. ✅ memory/reports/task-2542.md 박제
8. ✅ orchestration-audit jsonl 누적 박제

## 보고 형식

```
task-2542 GEMINI_TRIGGER_GAP_INVESTIGATION_REPORT — 9 범위 답변 / 4 사례 비교 / 8 대체 트리거 검증, 자동화 [가능|불가] / [구현 권고 task X | nudge 최후수단 유지], task-2537/2538 finalize 보류 [해제|연장] 권고, Critical 7종 0건.
```

## affected_files
- memory/reports/task-2542.md (NEW)
- memory/orchestration-audit/gemini-trigger-gap-260510.jsonl (APPEND only)
- memory/events/task-2542.done (NEW, finalize 면제 / report-only completion 마커)