# task-1990 보고서: Gemini 자동 수정 사이클 미동작 전수조사

**작성자**: 복합업무 임시팀장 (consulting + design 합동)
**작성일**: 2026-04-20
**검증 레벨**: critical
**프로젝트**: dev-system
**분석 참여**: 아스클레피오스(진단), 테미스(검증), 로키(레드팀 검증)

---

## Executive Summary (300자)

전체 결과: **근본 원인 5건 식별 완료 — 부분성공**. task-1983에서 Gemini 자동 수정 미동작의 PRIMARY 원인은 Gemini 리뷰 타임아웃(gemini_found=False)으로 수정 루프 미진입. SECONDARY: (1) `claude --print` 환경 의존적 수정 실패, (2) 리뷰 ID 미구분으로 기존 리뷰 오인, (3) `executed=True` 무조건 반환 게이트 허점, (4) task-1970 커밋 main 미반영. QG 실패 0건. 코드 수정 미실시(지시서 준수). 후속 코드 수정 작업 필요.

**최종 산출물**: 본 보고서 + Phase 1 산출물 3건

---

## Phase 1 상세: 코드 경로 추적 및 근본 원인 분석

### S (상황)
task-1970에서 Gemini 강제 적용 수정 완료(03:46) 후, task-1983(05:03~05:33) 실행 시 PR #4에 Gemini HIGH 2건 지적. 자동 수정 사이클이 동작하지 않아 타임아웃으로 머지 차단만 됨.

### C (문제)
자동 수정 코드가 존재하지만 실제 실행 시 동작하지 않는 이유 불명.

### Q (질문)
task-1970에서 구현한 Gemini 자동 수정 사이클이 왜 task-1983에서 동작하지 않았는가?

### A (답변)
5개 결함이 복합적으로 작용하여 자동 수정이 전혀 동작하지 않았음.

---

## 1. 근본 원인 (코드 레벨) — 5건

### 결함 #1 [PRIMARY]: Gemini 타임아웃 시 자동 수정 루프 미진입
- **위치**: `scripts/worktree_manager.py:875`
- **코드**: `if gemini_found and pr_number:`
- **원인**: Gemini 리뷰 대기(854~864행)에서 300초 타임아웃 시 `gemini_found=False` → 자동 수정 루프(877~912행) 전체 스킵
- **영향**: 자동 수정은 Gemini 리뷰가 시간 내 도착했을 때만 실행. 타임아웃 시 수정도 불가능.
- **심각도**: CRITICAL
- **검증**: 로키 CONFIRMED

### 결함 #2 [SECONDARY]: `claude --print` 환경 의존적 수정 실패
- **위치**: `scripts/worktree_manager.py:509-513`
- **코드**: `_run(["claude", "--print", "-p", combined_prompt], cwd=worktree_path, check=False)`
- **원인**: `--print` 모드는 도구 사용 자체를 차단하지 않으나(로키 검증), permission 설정이 사전 구성되지 않은 환경에서는 non-interactive 모드로 인해 Edit/Write 도구 사용이 자동 거부됨. 또한 `--dangerously-skip-permissions` 없이는 워크트리 환경에서 파일 수정 성공을 보장할 수 없음.
- **영향**: Gemini 리뷰가 정상 도착해도 코드 수정이 안 될 가능성 높음
- **심각도**: CRITICAL
- **검증**: 로키 CHALLENGED (완전 불가 → 환경 의존적 실패로 재진단)

### 결함 #3 [SECONDARY]: 리뷰 ID/타임스탬프 미구분
- **위치**: `scripts/worktree_manager.py:860, 901-912`
- **원인**: 재리뷰 대기 및 최초 리뷰 감지 모두 `"gemini-code-assist" in reviews.stdout.lower()` 문자열 검색만 수행. 리뷰 ID, created_at 등으로 기존/신규 리뷰를 구분하지 않음.
- **영향**: (1) 자동 수정 후 push → 이전 리뷰가 여전히 감지되어 즉시 break → 수정 전 리뷰를 수정 후 리뷰로 오인. (2) 동일 HIGH 무한 반복 가능.
- **심각도**: CRITICAL (로키 심각도 상향 제안 수용)
- **검증**: 로키 CONFIRMED + 심각도 상향

### 결함 #4 [SECONDARY]: `executed=True` 게이트 허점 (로키 신규 발견)
- **위치**: `scripts/worktree_manager.py:534, 900`
- **원인**: `_auto_fix_high_comments()`는 `claude --print` 실행 후 실제 파일 수정 여부와 무관하게 `{"executed": True}`를 반환. commit이 빈 상태(변경사항 없음)로 실패해도 executed=True → push/재리뷰 대기 진입.
- **영향**: 파일 미수정 → 빈 push → 이전 리뷰 즉시 감지 → 동일 HIGH 재파싱 → 3회 무의미한 사이클
- **심각도**: HIGH
- **검증**: 로키 신규 발견

### 결함 #5 [RESOLVED]: task-1970 커밋 main 미반영
- **위치**: git 히스토리
- **원인**: task-1970 관련 커밋이 어떤 브랜치에도 0건. task-1914가 동일 코드를 복원하여 현재 코드에는 반영됨.
- **현재 상태**: `collect_mode=False` 기본값이 현재 코드에 존재하나, 그 변경 출처가 git 히스토리에서 추적 불가.
- **심각도**: RESOLVED (현재 기능적으로 해소됨)
- **검증**: 로키 CONFIRMED

---

## 2. 현재 코드의 자동 수정 흐름도 (실제 코드 기준, 결함 반영)

```
cmd_finish() 호출 [collect_mode=False 기본값]
  ↓
PR 생성 (gh pr create)
  ↓
Gemini 리뷰 대기 (최대 300초, 30초 간격)
  ↓
  ├─ TIMEOUT (gemini_found=False)
  │   ↓
  │   ★ 결함 #1: 자동 수정 루프 미진입
  │   merge_status = "blocked_by_timeout"
  │   → 머지 차단. 수동 대응 필요.
  │
  └─ 리뷰 도착 (gemini_found=True)
      │  ★ 결함 #3: 기존 리뷰도 "도착"으로 오인 가능
      ↓
      _parse_gemini_comments() → HIGH 분류
      ↓
      HIGH 존재?
      ├─ No → 즉시 머지
      └─ Yes → _auto_fix_high_comments() 호출
               ↓
               프롬프트 생성 (OK)
               ↓
               claude --print 실행
               ★ 결함 #2: permission 미설정 시 파일 미수정
               ↓
               git add -A (변경사항 없을 수 있음)
               ↓
               git commit (빈 커밋 실패 가능)
               ↓
               ★ 결함 #4: 실패해도 executed=True 반환
               ↓
               git push (빈 push 또는 실패)
               ↓
               재리뷰 대기
               ★ 결함 #3: 이전 리뷰 즉시 감지 → break
               ↓
               동일 HIGH 재파싱 → 3회 반복 후 BLOCKED
```

---

## 3. 동작하지 않는 정확한 지점

1. **1차 차단 (task-1983 실제 원인)**: 875행 — Gemini 타임아웃으로 전체 루프 스킵
2. **2차 결함 (리뷰 도착 시에도 발생)**: 509-513행 — `claude --print` 환경 의존적 수정 실패
3. **3차 결함 (2차 이후 연쇄)**: 901-912행 — 리뷰 ID 미구분으로 기존 리뷰 오인
4. **4차 결함 (3차와 연쇄)**: 534행 — executed=True 무조건 반환

---

## 4. 수정 방안 제안 (코드 수정 미실시 — 지시서 준수)

### P0 (즉시): `claude --print` → 파일 수정 가능한 모드로 교체
```python
# AS-IS (환경 의존적 실패)
_run(["claude", "--print", "-p", combined_prompt], cwd=worktree_path, check=False)

# TO-BE: --dangerously-skip-permissions 또는 --permission-mode auto 추가
_run(
    ["claude", "--print", "--dangerously-skip-permissions", "-p", combined_prompt],
    cwd=worktree_path, check=False,
)
```
또는 Claude Code 대신 직접 파일 수정 로직 구현.

### P1 (높음): 타임아웃 후 지연 재시도 메커니즘
- Gemini 타임아웃 시 즉시 포기하지 않고, PR을 유지한 채 비동기 재시도
- 또는 gemini_timeout을 현재 300초에서 600초로 증가

### P2 (높음): 리뷰 ID 기반 구분 로직 추가
```python
# 현재 리뷰 수를 기록하고, 새 리뷰가 추가되었는지 확인
initial_review_count = len(json.loads(reviews_result.stdout))
# ... push 후 ...
new_reviews = json.loads(re_reviews.stdout)
if len(new_reviews) > initial_review_count:
    break
```

### P3 (중간): executed 게이트 수정
```python
# commit 결과를 확인하여 실제 수정 여부 판단
commit_result = _run(["git", "commit", "-m", "..."], cwd=worktree_path, check=False)
actually_executed = commit_result.returncode == 0
return {"prompts": prompts, "executed": actually_executed, "diff_stat": diff_stat}
```

### 우선순위 정리
1. **P0**: claude --print 교체 — 이것 없이는 리뷰 도착해도 수정 불가
2. **P1**: 타임아웃 증가/재시도 — 리뷰 도착률 향상
3. **P2**: 리뷰 ID 구분 — 무한 루프 방지
4. **P3**: executed 게이트 — 무의미한 사이클 방지

---

## 5. 완료 시그니처 검증

```
grep "_auto_fix_high_comments\|_high_img_re\|blocked_by_timeout" scripts/worktree_manager.py
→ 3건 모두 존재 확인 완료
```

- `_auto_fix_high_comments`: 485행 (함수 정의)
- `_high_img_re`: 452행 (정규식 변수)
- `blocked_by_timeout`: 930행 (타임아웃 머지 차단)

---

## 6. Quality Gate 이력

- Phase 1 (코드 분석): PASS — consulting팀 4건 + 로키 검증 CHALLENGED 1건/CONFIRMED 3건/신규 1건
- 로키 레드팀 검증: PASS — 주장 1 재진단 반영 완료
- QG 실패 건수: 0건

---

## Phase별 산출물

- `/home/jay/workspace/memory/tasks/task-1990-asclepius-diagnosis.md`: 아스클레피오스 진단
- `/home/jay/workspace/memory/tasks/task-1990-themis-verification.md`: 테미스 검증
- `/home/jay/workspace/memory/tasks/task-1990-loki-review.md`: 로키 레드팀 검증
- `/home/jay/workspace/memory/tasks/task-1990-handoff-1.md`: Phase 1 핸드오프
- `/home/jay/workspace/memory/reports/task-1990.md`: 본 통합 보고서

---

## 세션 통계
- consulting팀: 아스클레피오스 (도구 11회), 테미스 (도구 32회)
- 레드팀: 로키 (도구 23회)
- 총 에이전트: 3명
