# task-2253 완료 보고서

## SCQA

**S**: InsuRo 증권분석 Phase 2-2에서 CRM-증권분석 연동이 완성되어 customer_id 기반 분석 이력 관리가 가능해졌다. 그러나 합산 보장현황은 현재 업로드된 증권만 합산하며, 과거 분석 결과를 포함하지 않는다.

**C**: 보험 설계사가 고객의 전체 보장현황을 파악하려면 여러 시점에 분석한 결과를 통합해야 한다. 현재는 한 번에 업로드한 증권끼리만 합산되므로, 시간차로 분석한 증권이 합산에서 누락된다. 또한 합산 뷰에서 보험사별 구분, 미보장 항목 표시가 없어 실무 활용도가 떨어진다.

**Q**: customer_id 기반으로 기존 분석을 자동 로드하고, 토글로 합산 범위를 제어하며, 합산 뷰를 고도화할 수 있는가?

**A**: 백엔드 API 1건 개선 + 프론트엔드 합산 로직/뷰 전면 교체로 완성. TSC exit 0, npm build 성공(11.94s), API 라우팅 정상 확인.

---

## 작업 내용

### 1. 백엔드 — customer-policy-analyses API 개선 (토르)
- `GET /api/insuro/customer-policy-analyses/{customer_id}`에 `exclude_analysis_id` 쿼리 파라미터 추가
- `status=completed` 필터 추가 (실패/진행중 분석 제외)
- `exclude_analysis_id` 지정 시 해당 분석을 결과에서 제외 (현재 분석 중복 방지)

### 2. 프론트엔드 — 시간차 분석 합산 (프레이야)
- `previousAnalyses`, `includePrevious`, `isLoadingPrevious` 상태 3건 추가
- `loadPreviousAnalyses()` 함수: 고객 선택 + 분석 완료 시 기존 분석 자동 로드
- `pollStatus` 내부에서 분석 완료 시 `loadPreviousAnalyses()` 자동 호출
- 합산 계산: IIFE 패턴으로 `includePrevious` ON/OFF에 따라 현재+과거 또는 현재만 합산
- `byInsurer` 맵으로 보험사별 금액 추적

### 3. 프론트엔드 — 합산 뷰 UI 개선 (프레이야)
- "이전 분석 포함" Switch 토글 (고객 연결 시에만 표시)
- DEFAULT_COVERAGES 기준 전체 담보 렌더링 (미보장 항목도 표시)
- 보험사별 색상 비율 바 (11개 주요 보험사 매핑)
- 미보장 항목 "미보장" 라벨 표시 (text-destructive/60)

---

## 수정 파일 목록

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| server/main.py:4946 | exclude_analysis_id 파라미터 추가 | grep "exclude_analysis_id" OK (4946, 4957행) | verified |
| server/main.py:4956 | .eq("status", "completed") 필터 | grep "completed" OK | verified |
| src/pages/PolicyAnalysis.tsx:12 | Switch 컴포넌트 import | grep "Switch" OK | verified |
| src/pages/PolicyAnalysis.tsx:67-69 | previousAnalyses/includePrevious/isLoadingPrevious 상태 | grep "previousAnalyses" OK | verified |
| src/pages/PolicyAnalysis.tsx:108-130 | loadPreviousAnalyses 함수 | grep "loadPreviousAnalyses" OK | verified |
| src/pages/PolicyAnalysis.tsx:198-201 | pollStatus에서 기존 분석 자동 로드 | grep "loadPreviousAnalyses" OK | verified |
| src/pages/PolicyAnalysis.tsx:341-374 | 합산 계산 로직 (byInsurer 포함) | grep "byInsurer" OK | verified |
| src/pages/PolicyAnalysis.tsx:376-383 | INSURER_COLORS 상수 | grep "INSURER_COLORS" OK | verified |
| src/pages/PolicyAnalysis.tsx:688-760 | 합산 뷰 TabsContent 전면 교체 | grep "include-previous" OK | verified |

---

## 발견 이슈 및 해결

1. **LSP "never read" 진단 노이즈**: 프레이야의 코드 삽입 후 LSP가 새 변수들을 "never read"로 진단. 실제 TSC 실행 시 exit 0 — IIFE 내부 참조 + JSX 참조를 LSP가 지연 분석한 것. TSC 정합성 확인으로 해결.

2. **Supabase 환경변수 미설정**: 프론트엔드 브라우저 렌더링 불가 (VITE_SUPABASE_URL 미설정). Phase 2-2와 동일한 인프라 제약. 백엔드 API + TSC + 빌드로 대체 검증.

3. **main.py 908/920/922행 Pyright 경고**: Phase 2-2에서 확인된 기존 이슈 (ver_res.data/consent 타입 관련). 이번 작업 범위 밖, 별도 task 권장.

---

## L1 스모크테스트 결과
- 서버 재시작: 성공 (포트 8001, /api/status → 200)
- API 응답 확인:
  - `GET /api/insuro/customer-policy-analyses/test-id` → 401 (인증 필수 — 라우팅 정상)
  - `GET /api/insuro/customer-policy-analyses/test-id?exclude_analysis_id=abc` → 401 (파라미터 수용 확인)
- TypeScript: `npx tsc --noEmit` → exit 0
- 빌드: `npm run build` → 성공 (11.94s, dist/ 생성 2026-04-27 20:34)
- 스크린샷: L1 미통과 사유 — Supabase 환경변수 미설정으로 프론트엔드 렌더링 불가. 백엔드 API + 빌드 + TSC로 검증 대체.

---

## 빌드 결과
- 빌드: 성공 (11.94s)
- dist/ 타임스탬프: 2026-04-27 20:34

---

## 머지 판단
- **머지 필요**: Yes
- **브랜치**: task/task-2253-dev2
- **워크트리 경로**: /home/jay/projects/InsuRo/.worktrees/task-2253-dev2
- **커밋 수**: 2건 (ab63463, bc78f32)
- **머지 의견**: TSC 통과, 빌드 성공, API 라우팅 정상. 신규 코드 약 120줄 추가 (프론트 ~100줄, 백엔드 ~5줄). 기존 API 인터페이스 하위 호환 유지 (신규 쿼리 파라미터는 optional). Gemini PR 리뷰 후 머지 권장.

---

## 모델 사용 기록
- 토르(백엔드): sonnet — API 개선 (exclude_analysis_id + completed 필터)
- 프레이야(프론트엔드): sonnet — 합산 로직 + 토글 + 뷰 UI 전면 교체
- 오딘(팀장): opus — 설계/분배/검토/통합/빌드 검증

---

## 3문서 상태
- plan.md: status → completed
- context-notes.md: 3 Step Why + 결정 근거 기록
- checklist.md: 14/14 항목 체크 (100%)

## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

