---
task_id: task-2325
type: context
scope: task
created: 2026-04-30
updated: 2026-04-30
status: in-progress
---

# 맥락 노트: task-2325

**task**: task-2325

---

## 결정 근거

### 설계 기준 확정 (미팅 기록 vs 계획서 충돌 해결)
- source 파라미터: `source=trend-insight` (계획서 기준)
- 갱신 주기: 무료=주1회, 맥스=일1회 (계획서 기준)
- DataLab 실행 빈도: 일1회 (계획서 기준)
- 이슈성 계산식: `surge × log10(search_volume)` (계획서 기준)
- 미팅 기록의 다른 값(source=insight, 일2회 등)은 기각

### 기존 기능 분리 전략
- 기존 `trend_keywords` 테이블 및 `/api/insuro/keywords/top` API는 건드리지 않음
- 신규 5테이블(keywords, keyword_trends, keyword_saturation, keyword_rankings, failed_batches)과 `/api/insuro/trend-insight*` API만 사용
- KeywordAnalysis.tsx에서 "키워드 순위" 탭을 "트렌드 인사이트"로 교체 (내부 UI만 교체, 나머지 탭 영향 없음)

### 3 Step Why
1st Why: "왜 이 설계가 필요한가?" → 기존 키워드 순위(30개 고정)는 의미 없고, 설계사가 데이터 기반으로 글감을 판단할 수단이 없다
2nd Why: "왜 이 접근이 최선인가?" → 네이버 공식 API만 사용(법적 안전), 비용 0원, 포화지수 구현 가능, 2,000개 롱테일 커버
3rd Why: "왜 다른 대안보다 나은가?" → 블랙키위(유료/범용) 대비 보험 특화+Push형+글쓰기 원스탑, AI 예측(환각) 대비 규칙 기반 신뢰성

## 참조 자료

- 원본 계획서: `memory/plans/insuro-trend-insight/plan.md`
- 원본 체크리스트: `memory/plans/insuro-trend-insight/checklist.md`
- 에이전트 미팅: `memory/meetings/2026-04-29-keyword-ranking-redesign.md`
- Phase 1 task: task-2321 (DB 생성, keyword_pool_refresh, keyword-seeds)

## 주의사항

- main.py는 6600줄 이상 대형 파일 — Edit 시 정확한 컨텍스트 필요
- Pyright의 supabase 타입 경고는 `cast()` 사용하여 해결
- keyword_trends.order 컬럼: `period_start` (week_start 아님)
- keyword_saturation.order 컬럼: `collected_at` (calc_date 아님)
