# task-2968 · InsuRo 증권분석 Phase 3 MVP — 신규설계 비교 (codex↔ANU 합의)

## 배경
- Phase 2 완료·프로덕션 배포(grouping 지식DB 5테이블·confirmed map 암5군 10건·`comparison_gate.is_officially_comparable`=CONFIRMED만). 3사이클 미팅 + codex 설계 조율 확정. 회장 Go.
- 용도 = **설계사 전용 신규설계 비교**. 원칙 = confirmed-only(정확도 우선), 추정치 명시 라벨.
- repo `/home/jay/projects/InsuRo`, origin/main `eb01409d`. 담당 dev2.

## ★ 확정 설계 (codex↔ANU 합의)
### 백엔드 (먼저 — 계약 고정)
- 신규 API `POST /api/insuro/new-design-comparison`. 입력 = `existing_analysis`(증권분석 `analysis_table` + `result.meta.remaining_payment`/잔여납입 메타) + `new_design`(신규 담보 리스트·회사별 보험료·기준 가입금액).
- 처리: `lookup_group()`으로 기존/신규 담보 그룹 연결 → `map_state` 산출 → `gate_for_official_comparison()`/`is_officially_comparable()` 적용 → **CONFIRMED만 비교표 포함**, 나머지(LEARNED_RULE/AUTO_MAP/UNKNOWN/NOT_COMPARABLE)는 `excluded_reason`과 함께 **unknown report로 분리**.
- 계산: **`composite_calculator` 전체 재사용 금지**(plan_id/age/gender 최적조합 엔진이라 부적합). `composite-calculate-from-matrix`의 "baseline amount 대비 target 비례 환산" 규칙만 참고해 **선형환산 어댑터 신규 작성**(동일 한도 환산).
- ★ **최대 리스크(금소법)**: 기존 증권분석에 **담보별 월보험료가 없음**(증권 총보험료/잔여납입 메타만). 담보별 잔여보험료는 별도 배분 규칙이 필요 → **추정이 사실처럼 보이면 안 됨**. MVP는 담보별 기존 보험료를 **"추정치"로만** 노출하고, 배분 불가 시 **coarse/상품 단위로만** 표기. 억지 배분·정밀 사실화 금지.

### 프론트 (API 계약 확정 후)
- `/new-design-comparison` 라우트 신설(분석&도구 섹션, `routes.ts`). 표 UI = `CompositeComboResult`(좌측 담보명·가입한도 고정 + 회사/보험료 열 반복) 재사용.
- 토글 2개: `기존 vs 신규`, `공식비교 vs 비교불가 리포트`. 행 = `[담보명 | 기존 한도 | 기존 잔여보험료(추정) | 회사별 신규 한도 | 회사별 신규보험료 | 비고]`. **추정치는 badge/label로 분리 표기**, 공식 판정 아님 명시.
- 입력 경로: `PolicyAnalysis` → 고객별 분석 이력 선택 → 저장된 `analysis_table`/`remaining_payment`를 비교 입력으로 넘김.

## 원칙
- **confirmed-only**: CONFIRMED만 공식 비교, 나머지 "비교 불가" 리포트. 억지 비교 금지.
- **금소법**: 담보별 기존 보험료 추정을 사실로 오도 금지. 추정치 라벨·coarse fallback 필수.
- Surgical. 증권분석/Phase2 로직 무변경, 신규 API·화면만 추가.

## 완료 조건
- **PR**(백엔드 API + 프론트) + 회귀 + `npm run build` PASS + **실브라우저 스크린샷**(비교표·추정치 라벨·비교불가 리포트).
- `memory/reports/task-2968.md` + `.done` + ANU 콜백. **머지·배포 HOLD** — ANU 검증 + 회장 보고 후.

## goal_assertions (auto-generated)
- `npm run build`
