# task-1969: 인슈로 전수조사 적발 + Gemini PR 리뷰 지적 일괄 수정

## 목적
task-1967+1 전수조사 적발 16건 + Gemini PR 리뷰 지적 7건을 일괄 수정.

## ★ 반드시 먼저 읽을 파일 ★
1. `memory/reports/task-1967+1.md` (전수조사 보고서 — 적발 목록)
2. `memory/reports/task-1968.md` (Gemini 강제 적용 원인 분석)
3. 인슈로 프로젝트: `/home/jay/projects/InsuRo/`

## 수정 범위

### Phase A: 브랜치 머지 (main 미반영 해결)
1. task/task-1962-dev1 브랜치 → main 머지 (CR-3,4,5 해결)
2. task/task-1964-dev1 브랜치 → main 머지 확인 (이미 PR 머지됨, pull만 필요할 수 있음)

### Phase B: Gemini PR 리뷰 지적 7건 수정 (인슈로)
1. **[CRITICAL] Naver API 키 서버사이드 이동**: NaverSearchRequest에서 client_id/secret 제거 → 서버 환경변수에서 로드
2. **[HIGH] subprocess.run 비동기 전환**: anu_provider.py의 subprocess.run → anyio.to_thread.run_sync 또는 def로 변경
3. **[HIGH] _keyword_jobs 인메모리 → DB**: Supabase 테이블로 이관 또는 Redis 사용
4. **[HIGH] 맥스 플랜 잔여석 필터**: 전체 active 카운트 → 특정 플랜만 필터
5. **[MEDIUM] AsyncClient 전역 재사용**: 요청마다 생성 → 전역 인스턴스
6. **[MEDIUM] 랭킹 DB 집계**: Python 합산 → SQL GROUP BY/SUM/ORDER BY
7. **[MEDIUM] N+1 토픽 쿼리**: 루프 내 개별 조회 → .in_() 배치 조회

### Phase C: 전수조사 WARNING 수정 (선별)
8. **M5 Dashboard.tsx**: 라우트 등록 또는 파일 삭제 (고아 파일 정리)
9. **M6 as any 정리**: Settings.tsx 17건 타입 수정
10. **P5 채널 제한 UI**: 프론트에서 403 대신 사전 안내 UI 추가
11. **F1 무료 카운트다운**: DB에서 실제 사용량 조회하여 잔여 횟수 표시
12. **AU-1 감사 로그**: Python 서버 AI 호출 경로에도 로깅 추가

### Phase D: 전수조사 CRITICAL 수정
13. **C6 OAuth 토큰 암호화**: AES-256-GCM 또는 Fernet 암호화 구현 (환경변수 마스터키)

### 제외 (의도적 미구현 또는 별도 Phase)
- M3 subprocess→API 전환: 대규모 리팩토링 → 별도 task로 분리
- C3 네이버 AI원스탑: 의도된 "출시 예정" 표시 → [x] → [ ] 체크리스트만 수정
- C7 파이프라인 시뮬레이션: MVP 의도 → 유지
- H4 KeywordAnalysis: 프리미엄 백엔드 미구현이므로 현재 동작 정상
- D3 위키 랭킹 프론트: 별도 Phase
- CP-1 경쟁사 비교: 디자인 작업 포함 → 별도 task
- T3 E2E 테스트: 별도 task

## ★★★ 절대 규칙 ★★★
- API 직접 호출 금지 — AI 호출은 CLI로만
- premiumOnly 미완성 디자인 절대 건드리지 말 것
- 기존 테스트 회귀 금지

## 검증 시나리오
1. tsc 0 errors, pytest PASS
2. Naver API에서 클라이언트 키 제거 확인 (grep NaverSearchRequest)
3. subprocess.run이 async 컨텍스트에서 블로킹하지 않음 확인
4. 맥스 플랜 잔여석이 정확한 플랜만 카운트하는지 확인
5. task-1962-dev1 머지 후 Phase 4 API 4종 main 존재 확인
6. OAuth 토큰 암호화 코드 존재 확인 (grep AES\|Fernet\|encrypt)

## 레벨
- critical

## 프로젝트
- insuro
