# task-2975 · [T3-A] InsuRo 약관 업로드 배선 + confirmed 시드 적재

## 배경 (T3 배치안 합일 — 회장 승인 2026-08-18)
- 회장 확정 파이프라인의 첫 단추. 엔진(axes추출·grouping 4단계·map_state·학습전이)은 구현됐으나 "돌게 할 손잡이"가 없음. T3-A는 **지식DB에 실데이터를 주입하는 배선**.
- 배치안: `memory/plans/insuro-policy-analysis_260812/T3-batch-plan_260818.md`(§ANU 판정 확정). 계획서 동 폴더 `plan.md`.
- repo `/home/jay/projects/InsuRo`, origin/main `46dc2c4d`. 담당 dev1(헤르메스, 백엔드). 서버=user systemd `insuro-api`. Supabase INSURO_NEW(prod).

## 현 상태 (실측)
- 약관 정독 파이프라인 `server/policy_grouping/pipeline.py:304 analyze_product(pdf)`(split→정독→axes→매핑→학습)은 **CLI/테스트 전용**, HTTP 라우트·프론트 미연결.
- 시드 `server/policy_grouping/seed_cancer5.py`(삼성 New내돈내삼 16402601, 암5군 10 cov_id, 멱등)는 **runnable 엔트리포인트 부재**(테스트만 호출) → confirmed DB 비어있음.

## 작업 2건 (백엔드)
### A-1. 약관 PDF 업로드 엔드포인트 → analyze_product 배선
- 약관 PDF 업로드 HTTP 엔드포인트 신설(설계사 인증). `pipeline.analyze_product` 연결.
- 저장 규칙(계획서 §파일저장): 약관 원본 PDF는 **Google Drive**(기존 P0-1 프록시 체계, `drive_file_id`만 DB). DB엔 clause **excerpt + 매핑**만(clause_text 전문은 axes추출용 휘발, DB 저장 금지).
- coverage_product/coverage_clause upsert 확인(terms_sha256 dedupe).
- axes 추출 LLM 정독 = 비용/시간 → **async 처리 + 결과 캐싱**(같은 terms_sha256 재업로드 시 재정독 금지).

### A-2. 시드 적재 CLI 스크립트 (라우트 아님)
- `seed_cancer5.seed()`를 실행하는 **CLI 명령/스크립트**(관리자 1회성, service_role 경로). 라우트 노출 금지.
- 삼성 암5군 10건 confirmed를 프로덕션 DB(INSURO_NEW)에 멱등 적재. 기존 confirmed 충돌 시 skip(seed 안전장치 유지).

## 원칙
- Surgical. 기존 엔진 무변경, 배선·엔트리포인트만 추가. 금소법: 시드는 provenance 인용 있는 것만(ineligible skip 유지).
- 비밀 노출 금지(service_role 값 로그 금지).

## 완료 조건
- **PR** + 회귀 + L1 스모크: (a) 약관 PDF 1건 업로드 → coverage_product/clause upsert 실측(curl/로그) (b) 시드 CLI 실행 → confirmed 10건 DB 조회 실측.
- `memory/reports/task-2975.md`(업로드 실측 + 시드 10건 조회) + `.done` + ANU 콜백. **머지 HOLD**(ANU 검증 후).