# 보고서: task-129.1 — InsuWiki Phase 3: Claude Code 요약 파이프라인

## 작업 내용
InsuWiki 보험약관 PDF 3단계 요약 시스템의 Phase 3 — Claude Code 요약 파이프라인을 구현.
PDF 인덱싱 완료 후 생성되는 summary_jobs를 감지하여, Claude Code 팀봇이 Level 2(섹션별) + Level 1(핵심) 요약을 생성하고 Firestore에 저장하는 전체 파이프라인 구축.

## 생성/수정 파일 목록

| 파일 | 작업 | 변경 사유 |
|------|------|-----------|
| `scripts/summary-pipeline.ts` | 신규 (664줄) | CLI 파이프라인: list/read/save/complete 서브커맨드 |
| `scripts/prompts/summary-prompts.ts` | 신규 (410줄) | Level1/Level2/디스패치 프롬프트 템플릿 + 빌더 함수 |
| `scripts/tsconfig.json` | 신규 | 스크립트 전용 TypeScript 설정 |
| `nextapp/src/app/api/admin/summary-jobs/route.ts` | 신규 (146줄) | GET(목록 조회) + PATCH(상태 업데이트) API |
| `nextapp/src/app/api/admin/summary-generate/route.ts` | 신규 (215줄) | POST(요약 저장) + GET(요약 조회) API |
| `teams/dev2/plan-task-129.1.md` | 신규 | 작업 계획서 |

## 구현 상세

### 1. 요약 파이프라인 CLI (summary-pipeline.ts)
- **list**: summary_jobs 컬렉션에서 pending/failed 상태 조회, 7일 이상 STALE 표시
- **read <jobId>**: insurance_chunks 읽기 → 섹션(관/장/절/부칙) 자동 감지 → 섹션별 텍스트 출력
- **save <jobId> --input <file>**: JSON 파일로 Level1+Level2 요약을 insurance_summaries에 저장 (idempotent)
- **complete <jobId>**: summary_jobs 상태를 수동으로 complete 처리
- Firebase Admin SDK: 3단계 인증 우선순위(JSON키 → ADC파일 → ADC fallback)

### 2. 프롬프트 설계 (summary-prompts.ts)
- **Level 2 프롬프트**: 보험약관 분석 전문가 역할, 핵심보장/면책/지급조건/특약 4항목 구조화 출력
- **Level 1 프롬프트**: 수석 전문가 역할, 핵심보장/주요면책/차별점 1~2문단 집약
- **디스패치 프롬프트**: 아누→팀봇 작업 지시 템플릿 (5단계 워크플로우, 품질 기준, 오류 처리)
- **환각 방지**: HALLUCINATION_GUARD 공통 블록 적용 (원문 외 추가 금지, 불확실 표현 금지)
- 빌더 함수 3개: buildLevel2Prompt(), buildLevel1Prompt(), buildDispatchPrompt()

### 3. 어드민 API
- **GET /api/admin/summary-jobs**: status 필터링, 최신순 정렬
- **PATCH /api/admin/summary-jobs**: jobId 기반 상태/에러 업데이트
- **POST /api/admin/summary-generate**: 요약 결과 저장 (기존 삭제→재저장 idempotent)
- **GET /api/admin/summary-generate?productId=**: 특정 상품 요약 조회
- 인증: Bearer token + ADMIN_EMAILS 패턴 (기존 drive-upload 패턴 동일)

## 테스트 결과

### 헤임달(테스터) 코드 리뷰 결과
- summary-pipeline.ts: 10개 검증 항목 **전체 PASS**
- summary-prompts.ts: 5개 검증 항목 **전체 PASS**
- TypeScript 빌드: **PASS** (타입 오류 0건)

### 발견 이슈 및 수정 완료
1. **[Warning → Fixed]** 디스패치 프롬프트 스키마 불일치: `summaryText` → `content`, `sectionIndex` 제거, `completedAt` → `updatedAt`, 불필요 필드 제거
2. **[Warning → Fixed]** 디스패치 프롬프트 섹션 패턴 오류: `"제N조"` → `"제N관/장/절/부칙"`으로 실제 코드와 일치시킴
3. **[Warning → Fixed]** jobId 인수 검증 누락: `--`로 시작하는 인수를 jobId로 오인하는 문제 → 검증 추가
4. **[Info → Fixed]** 섹션 패턴 regex 유연성: `\S+`(필수) → `\S*`(선택)로 완화하여 제목이 다음 줄인 형식도 감지

### 미수정 이슈 (허용 가능)
- **[Info]** 동시 처리 시 read 커맨드 중복 가능성: status 업데이트 실패 시에도 계속 진행 (일 3~4건 수준에서 허용)
- **[Info]** 청크-섹션 경계 불일치: 한 청크에 두 섹션이 걸칠 때 전체가 새 섹션에 귀속 (요약 품질에 큰 영향 없음)
- **[Critical → N/A]** 환경변수 미설정: 배포 환경 설정 이슈로 코드 문제 아님

## 검토한 대안 및 기각 사유
1. Cloud Function 기반 자동 요약 → Gemini Flash API 비용($3-7/월) 발생, Claude Code 무비용 방식 채택
2. API 기반 실시간 요약 → 응답 시간 불확실, 타임아웃 위험, 비동기 배치(CLI) 방식 채택
3. 단일 스크립트(all-in-one) → 디버깅 어려움, 서브커맨드 분리로 단계별 실행 가능하게 설계

## 셀프 QC

### 1. 이 변경이 다른 파일에 영향을 미치는가?
아니오. 모든 파일이 신규 생성이며, 기존 pdfIndexing.ts, firestore.ts, firestore.rules는 수정하지 않음. Phase 2에서 이미 정의된 InsuranceSummary 타입과 insurance_summaries 컬렉션 규칙을 그대로 활용.

### 2. 이 로직의 엣지 케이스는 무엇인가?
- 청크 0개인 productId → read 커맨드에서 job status를 'failed'로 처리
- 섹션 헤더 미감지 시 → 전체를 하나의 "전체" 섹션으로 묶어 처리
- 재인덱싱으로 동일 productId에 대해 다시 save → 기존 summaries 전부 삭제 후 재저장 (idempotent)
- 7일 이상 pending된 stale job → list 시 경고 표시

### 3. 이 구현이 작업 지시와 정확히 일치하는가?
Phase 3 체크리스트 7개 항목 모두 구현:
- [x] summary_jobs 감지 로직 (list 서브커맨드)
- [x] 아누 → 팀봇 dispatch 프롬프트 설계
- [x] 팀봇 요약 워크플로우 (read → 요약 생성 → save)
- [x] Firestore insurance_summaries에 저장
- [x] summary_jobs status 업데이트 (pending → processing → complete/failed)
- [x] 에러 처리: 실패 시 status=failed + error 메시지
- [x] 통합 테스트 대비: CLI + API 양쪽에서 전체 흐름 가능

### 4. 에러 처리와 보안은 확인했는가?
- 에러 처리: 모든 Firestore 연산에 try/catch, 실패 시 job status failed + error 기록
- 보안: Admin API는 Bearer token + ADMIN_EMAILS 검증, Firestore rules에서 insurance_summaries는 인증 사용자 읽기만 허용
- 입력 검증: JSON 파싱 실패, 필수 필드 누락, 잘못된 status 값 모두 처리

### 5. 테스트가 모든 경로를 커버하는가?
헤임달 코드 리뷰에서 정상/에러 모든 경로의 로직을 검증함. TypeScript 타입 체크 통과. 실제 Firestore 연결 테스트는 환경변수 설정 후 수동 테스트 필요 (배포 환경 의존).

## 팀장 검토 결과

| 팀원 | 결과물 | 검토 |
|------|--------|------|
| 토르(백엔드) | summary-pipeline.ts, admin API 2개 | 1차 검토 통과, 수정 사항 없음. Firebase 초기화 패턴, 에러 처리, idempotent 로직 모두 양호 |
| 미미르(UX/프롬프트) | summary-prompts.ts | 1차 검토 후 수정 3건 반영: 스키마 불일치, 섹션 패턴 오류, 오류 처리 문구. 수정 후 2차 검토 통과 |
| 헤임달(테스터) | 코드 리뷰 보고서 | 1차 검토 통과, 수정 사항 없음. Critical 0건, Warning 4건(모두 수정 완료), Info 3건(허용) |

## 비고
- Phase 4(프론트엔드 3단계 요약 UI)는 별도 태스크로 진행 필요
- 실제 약관 PDF를 사용한 E2E 테스트는 Firestore 환경 설정 후 수행 필요
- 디스패치 프롬프트는 cron 알림 → 아누 → 팀봇 경로로 사용
