# task-2050: InsuRo Gemini MEDIUM 피드백 12건 수정

## 배경
Gemini PR 리뷰의 MEDIUM 피드백 30건 중 수정 필요 12건을 선별하여 일괄 수정.

## ★ 프로젝트: `/home/jay/projects/InsuRo/` (main 브랜치에서 worktree 생성)

## 수정 필수 (5건 — 버그/보안 영향)

### M-1: JSON.parse 에러 핸들링 (PR#7)
- 파일: `src/lib/ctaExposurePolicy.ts`
- 문제: `JSON.parse` 실패 시 앱 크래시. 컴포넌트 렌더링 중 호출되어 위험
- 수정: try-catch로 감싸고 파싱 실패 시 기본값 반환

### M-2: 중복 CTA 카운트 로직 제거 (PR#7)
- 파일: `src/components/LockedFeatureOverlay.tsx`
- 문제: 기존 `insuro_upgrade_prompt_count` 로직이 새로운 `ctaExposurePolicy`와 중복/충돌
- 수정: 기존 70~80행의 레거시 카운트 로직 제거, ctaExposurePolicy만 사용

### M-3: window.location.href → useNavigate (PR#10)
- 파일: `src/components/crm/PreviewGuard.tsx`
- 문제: `window.location.href` 사용 시 SPA 전체 새로고침
- 수정: `useNavigate` 또는 `navigate()` 사용

### M-4: docstring 3곳 "프로 이상" → "맥스 이상" (PR#11)
- 파일: `server/main.py` L1033, L1222, L1428 근처
- 문제: require_feature 변경 후 docstring이 구버전("프로 이상") 유지
- 수정: "프로 이상 플랜 필요" → "맥스 이상 플랜 필요"

### M-5: pipeline status "completed" → "success" 일관성 (PR#12)
- 확인: 커밋 0536252에서 이미 수정되었을 수 있음. main에서 확인 후 잔존 불일치만 수정
- `grep -rn '"completed"' server/pipeline.py server/main.py` → 불일치 있으면 수정

## 수정 권장 (7건 — 성능/품질)

### M-6: AsyncClient 전역 재사용 (PR#1)
- 파일: `server/main.py`
- 문제: 요청마다 `AsyncClient`를 새로 생성 → 성능 낭비
- 수정: 전역 `_http_client = httpx.AsyncClient()` 선언, lifespan에서 close

### M-7: N+1 쿼리 → 배치 조회 (PR#1)
- 파일: `server/main.py` (요약-토픽 조회 부분)
- 문제: 루프 내 개별 토픽 조회 → N+1 문제
- 수정: summary_id 수집 → .in_() 한 번에 조회 → 메모리 매핑

### M-8: Python 합산 → DB GROUP BY (PR#1)
- 파일: `server/main.py` (기여 데이터 합산 부분)
- 문제: 전체 데이터 메모리 로드 후 Python 합산
- 수정: Supabase RPC 또는 .select() + GROUP BY 활용

### M-9: Supabase 클라이언트 전역 초기화 (PR#2)
- 파일: `server/main.py`
- 문제: 요청마다 `_get_supabase_client()` 호출
- 수정: 전역 초기화 + 캐싱

### M-10: AsyncClient lifespan 종료 (PR#2)
- 파일: `server/main.py`
- 문제: 서버 종료 시 AsyncClient 미닫힘 → 리소스 누수
- 수정: FastAPI lifespan 핸들러에서 `await client.aclose()`

### M-11: Promise.all 병렬 쿼리 (PR#9)
- 파일: `src/hooks/use-wiki-performance.ts`
- 문제: 두 독립 쿼리가 순차 실행
- 수정: `Promise.all([query1, query2])` 병렬화

### M-12: decode errors='replace' (PR#3)
- 파일: `server/anu_provider.py` 2곳
- 문제: 유효하지 않은 UTF-8 시퀀스 시 UnicodeDecodeError
- 수정: `.decode('utf-8', errors='replace')` 적용

## 완료 시그니처
- [grep] `try.*JSON.parse\|catch.*JSON` @ `src/lib/ctaExposurePolicy.ts`
- [grep] `useNavigate\|navigate(` @ `src/components/crm/PreviewGuard.tsx`
- [grep] `맥스 이상` @ `server/main.py`

## 검증 시나리오
1. `npm run build` → 빌드 성공
2. `cd server && python -m pytest tests/ -x --tb=short` → 기존 테스트 PASS
3. `npx vitest run` → 프론트 테스트 PASS
4. M-1~5 필수 수정 grep 확인
5. M-6~12 권장 수정 코드 변경 확인

## 레벨
- normal

## 프로젝트
- insuro
