# 체크리스트 — InsuRo 증권분석/신규설계

**작성일**: 2026-08-12 · 계획서: `plan.md` · 맥락: `context-notes.md`
원칙: 1 Phase = 1 세션. **Phase 0 게이트 없이 Phase 1 착수 금지.**

## Phase 0a — 측정 하네스 + 정답셋 (코드 최소·방향타)
> **task-2937 완료 (2026-08-12, dev1 헤르메스)** · 판정표 `teams/dev1/task-2937-policy-spike/reports/PHASE0_VERDICT.md` · 보고서 `memory/reports/task-2937.md`

- [x] 약관 3건(메리츠 세분/통합·삼성 통합) 데이터 고정 — **실증권은 회장 미제공 → ⏸ 보류**
- [x] **정답셋 라벨링(헤르메스 갭A)**: 약관 실질 읽고 담보 141건 라벨(정답 그룹 + 예외조항 6종 + 출처위치). **회장 검수 대기**
  - ※ 라벨 프로토콜 결함 발견: quote를 verbatim이 아닌 요약으로 기록 → **향후 verbatim 인용 강제**(metrics_definition.md 7절)
- [x] **★[로키 최대지적] 숨은 예외조항 recall 측정** — **quote 기반 지표는 측정 아티팩트로 무효화**, 대체 지표 「신호 포함률」로 재측정
  - 신호 포함률 **85.4%** / 리터럴 키워드 recall **43.4%** / **SEMANTIC_ONLY 42.1%** / MISS 14.6%
  - ★결론: 위치(별표·주석) 은닉은 소수. 진짜 위험은 **표현방식** — 감액은 "감액" 대신 지급률 표(리터럴 18.3%), 면책은 "암보장개시일+90일" 정의(리터럴 1.7%), "정액"은 원문에 미등장 → **키워드 기반 lazy-fetch는 감액·면책을 구조적으로 놓침**
- [ ] **[로키] 설계사 검수 부담 실측**: 담보 1건당 검수 소요시간·질문 발생빈도 — **미착수**(실증권·설계사 실사용 필요)
- [ ] `policy_analyzer.py`에 실증권 통과 → **담보 추출 정확도** 측정 — ⏸ **측정불가(실증권 미제공)**
- [ ] JPG(증권 사진) → **vision LLM(Opus) 추출 정확도** 측정 — ⏸ **측정불가(실증권 사진 미제공)**
- [x] **"이름만으로 grouping 정확도"** 측정 + **[헤르메스 갭B] 판정 임계** → **50.0%(42/84, 암담보 기준) = FULL_PARSER 확정**
  - ★오류 성질: 이름으로 **확정한 건은 오판 0건**, 불일치 42건은 **전부 `UNKNOWN_ADVISOR`(판정 불가)** → "틀리는" 게 아니라 **"모르는"** 문제. 약관 미독해 시 **절반이 미분류**
  - 판정불가 3대 원인: ①`암특정치료비` 계열 지급방식(정액/비례) 담보명 미표기 ②`전액본인부담(비급여포함)` 세부구분 불가 ③taxonomy에 **검사비/수술비/지원금 축 부재**
- [x] **[신규] 약관 담보 발췌 recall 측정** — **34.8%(80/230)** ❌ FAIL. 「암진단비」·「유사암진단비」 통째 누락
  - 근본원인: 담보 헤딩 정규식이 `N-M.`(하이픈) 형식만 매칭 → 메리츠 `13.` 형식 절 전부 탈락
  - 독립 정답목록 `truth_coverage_list_*.json` 구축 = **Phase 2 회귀 게이트**
- [x] **[신규] 약관 표지 파싱** — textlayer **94.4%**(17/18) ✅ / vision **72.2%**(13/18) ❌ 목표 미달
  - 권고: **textlayer-first + vision-fallback**. vision은 느리고(40~50초) 더 부정확, 최약점이 `product_code`·`product_name`(= Drive 논리키 필드)
  - 삼성은 판매버전·약관번호가 문서 전체 1474p에 **0건** → Drive 경로 논리키는 **회사별 필드 결손 전제** 설계 필요
- [ ] taxonomy **동결(frozen anchor)** — ⚠️ **동결 보류 권고**. 회장 판단 필요 2건:
  - ★삼성 **"하이클래스" 브랜딩이 taxonomy 정의와 역매칭** — 명칭이 "하이클래스"인 담보(013/014)는 단일 정액이고, 정의에 맞는 항목별한도는 `전액본인부담(비급여포함)특정치료비`(022/026/035/036/039). **동결 후 발견 시 지식DB 전체 오염**
  - taxonomy에 **검사비/수술비/지원금 축 부재** → (a)그룹 신설 (b)다른 대구분 배치 (c)범위 외 중 택일

## Phase 0b — vision 어댑터 (신규 개발·별도 세션)
- [ ] JPG/증권 사진 **vision 어댑터 프로토**(기존 policy_analyzer는 PDF 전용) + 숫자 오독률 측정(목표 ≥90%)
- [x] 약관 표지 첫 페이지 vision 파싱 → 회사·상품코드·판매개시일·판매버전·약관번호 추출 검증 — **task-2937 완료**. vision 72.2% < textlayer 94.4% → **textlayer-first + vision-fallback 권고**
- [ ] 오독률 목표 미달 시 "설계사 검수 강도↑" → Phase 1 UX에 반영
- [ ] **[B1 해소] 추출 스키마 최소 필드 확정**: meta(보험사·상품명·상품코드·판매개시일·약관버전·sha256) + coverage(category·name·amount·unit·memo + **grouping 플래그: 유사암 포함여부·감액(유무/기간)·갱신형 여부·급여/비급여·지급방식(정액/비례/한도)**) + provenance(발췌 페이지/조항·프롬프트버전·모델버전)
- [x] **[B5 해소] Phase 0 판정표** — **task-2937 완료**: `reports/PHASE0_VERDICT.md`
  - ④**추출 스키마 적합성 = 부적합.** grouping 플래그 **0/5** 구조화 수용 → **판정: wrap**(extend ✗ / rewrite ✗)
    - `DEFAULT_COVERAGES` 고정 화이트리스트 + 프롬프트 규칙1(`policy_analyzer.py:178`) → 세분형/하이클래스 등 **AI 출력 단계 원천 탈락**(최치명)
    - `amount`=`int(만원)` 강제(`:254-258`) → 비례·연간한도·항목별한도 **표현 불가** / provenance 자리 없음 / 입력 PDF 1개+타임아웃 120초 → 1767p 약관 커버 불가
    - → `policy_analyzer`=증권 추출 현행 유지 + 약관/grouping/JPG vision=**신규 모듈 분리 후 래핑**. plan.md 위임계획과 **일치**, 회귀 위험 0(`main.py:7027-7071` 무변경)
  - ①약관 발췌 34.8% ❌ / ②vision(표지) 72.2% ❌ / ③이름grouping 50.0% → FULL_PARSER / ⑥증권추출·⑦JPG vision ⏸측정불가
- [ ] **[정정] JPG/vision 어댑터 = 신규**: 기존 policy_analyzer는 PDF만 → JPG vision은 신규 어댑터 필요(기존 코드 밖)

## Phase 1 — 보장분석 MVP (읽기전용)
- [ ] 신규 `policy_normalizer.py`: `policy_analyses.result` → 표시용 가입현황 뷰모델
- [ ] 대구분 순서 고정(실손→진단비→치료비→수술비→일당→장애→요양→사망→운전→생활)
- [ ] `기타` → 요양/사망/운전/생활 재매핑 (표시 계층)
- [ ] 여러 증권 병합(회사별 열 자동, 같은 담보 합산)
- [ ] 권장가입금액 관리 기능: 관리자 일괄 기본값 + 설계사 개인 오버라이드(담보별 단일값)
- [ ] 권장 대비 적정/부족/충분 판정 표시
- [ ] 리모델링 코멘트: AI 1차 생성 + 설계사 수정 UI
- [ ] JPG vision 추출 + **설계사 검수·수정 UI**(원본 이미지 옆 추출값 나란히)
- [ ] 인슈로 UI 업로드 페이지(PDF/JPG)
- [ ] grouping v0 = 결정론적 룩업표 + "미분류" 버킷 (AI·축적 없음)
- [ ] 1~2장 프린트 전용 CSS(값있는행만·page-break·합계반복) + PDF 다운로드
- [ ] 최하단 고지 작은 글씨("참고용, 정확한 보장은 약관 기준")
- [ ] 파일 저장: 증권 `/policies/{설계사}/{고객}/...`(P0-1 프록시 비공개), DB엔 drive_file_id
- [ ] [OPEN] 골든셋 픽스처 초안(이름≠실질·통합vs세분·단위함정)

## Phase 2 — 암 grouping 엔진 + 지식DB
- [ ] 지식DB 최소 스키마: product_master / coverage_clause_snippet / coverage_grouping_candidate / coverage_grouping_confirmed / coverage_overlap_relation / advisor_rule
- [ ] 3축 불가침 포함: canonical id · provenance(조항 참조) · 상품버전(sha256/effective_date) · confidence
- [ ] grouping 유형 = **tag/label 테이블**(enum 하드코딩 금지)
- [ ] 약관 발췌 파이프라인: 조항경계(TOC)+키워드+참조 1-hop, async 세마포어, 2계층 캐시(추출/판정)+버전키, OCR필요=명시적 실패
- [ ] 약관 저장: `/policy_terms/{손보|생보}/{보험사}/{상품코드}/{판매개시일}/` + sha256 dedupe
- [ ] grouping 엔진: rule-first → 지식DB 조회 → LLM(근거조항+confidence) → 애매시 설계사 질문/drag
- [ ] 담보 canonical 상품 넘어 공유(product↔coverage 다대다)
- [ ] 설계사 확정 → 지식DB 축적(학습 루프). 담보실질=공유 / 철학=개인 분리 저장
- [ ] 아누시스템(claude 무학습) 판정 경로 연결
- [ ] Phase 1 미분류 백필
- [ ] 인슈위키 조회 API(또는 push) — 지식DB 단일 원천
- [ ] **[B2 해소] 질문 종료조건 확정**: confidence < 0.7 → 설계사 질문/drag. 질문 상한 = 담보당 1회 · 세션당 상위 애매 N개(예: 10). fallback = 설계사도 애매 → **미분류(UNKNOWN) 버킷**(표에 별도 표시, 나중 큐레이션)

## Phase 3 — 신규설계 비교 MVP (암 핵심만)
- [ ] 신규 `policy_comparison_engine.py`
- [ ] 회사별 [한도 | 보험료 | 비고] + 합계보험료
- [ ] 단위 가입한도당 보험료(가성비) 계산 — 결정적 함수(AI 분리)
- [ ] 잔여보험료 vs 신규보험료 비교(동일 가입한도 환산) — calculate_remaining_payment 래핑 + calculation_mode/confidence
- [ ] 선택 토글(최종결정) + 가입한도 변경 → 선형 비례 재계산(`composite_calculate_from_matrix` **선형 로직 참고 + 신규 어댑터**) + **"추정치" 표기**
- [ ] **[B4+아르고스] UNKNOWN 승격 4경로**: (1)baseline(captured)=0 → 0폴백을 UNKNOWN 변환 (2)부분 premium 결측(일부 회사만) → 셀 UNKNOWN·합계 제외 (3)단위 혼재(만원/원) 태그 불일치 → UNKNOWN (4)잔여보험료 parse-fail `_default`(개월0·완료False 모순) → UNKNOWN. 담보별 보험료 없으면 UNKNOWN(억지배분 금지)
- [ ] **[아르고스] 합산 불변식**: 통합↔세분 N:M에서 동일 canonical 1회만 합산(이중계산 금지) + 병합 레벨 dedupe(동일 sha 중복업로드 이중합산 금지)
- [ ] 갱신형/비갱신형 분리 태깅
- [ ] 세분형 ↔ 주요치료비(③) 비교
- [ ] 화면=상세 / 프린트=요약 분리
- [ ] **[B3 해소] 역산 검증 규칙**: 재계산 `unit_price=premium/captured; recalc=unit_price×target` → 역산 `recalc/target×captured =? premium`(±6원). 잔여보험료 `월×잔여개월=총잔여` 역검. 불일치 시 UNKNOWN

## Phase 4 — 확장·하드닝
- [ ] 순환계 치료비 담보군(회장 실무 taxonomy 받아 확장) → 이후 운전자보험
- [ ] 약관 개정 diff("이번 약관에서 이렇게 바뀌었다") 안내
- [ ] 지식DB 버전 관리/감사/dispute·롤백/골든셋 회귀 게이트
- [ ] 멀티테넌시(대리점 유료 판매·지식은 동일 공유·수익=이용료·격리는 고객데이터/철학)
- [ ] **★[로키 hard precondition] 베타오픈(대리점 판매) 전 필수**: 지식DB 롤백+승인이력+골든셋 배포차단 게이트 / 약관 저작권 정리. (현재 회장 단독 사용이라 오염 fan-out 없음 → 베타 전까지 유예 가능)
- [ ] PII 마스킹·약관 저작권(테스트 중 문제 소지 확인 시)
- [ ] 인쇄 폴리시·엣지·지식DB 큐레이션·약관 발췌 캐싱

## 검증 게이트 (공통)
- [ ] 골든셋 12~15케이스 그린 시 릴리스 (이름≠실질 3 / 통합vs세분 1쌍 / 동의어 2쌍 / 갱신형 1쌍 / 계산 함정 4 / OOV 1)
- [ ] 설계사 정정 → 골든셋 자동 편입(회귀 영구 차단)
- [ ] 반올림 ≤6원 통과·초과 UNKNOWN, 계산 역산 검증

## 회장 확인 필요 (착수 전)
- [ ] Phase 0 착수 승인
- [ ] cold start 씨앗 grouping 데이터 회장 제공 + 회장 선(先)테스트
