# [Lv.4] 복합설계 RP 프레젠테이션 — 회장 PPT 3장 그대로 구현 (비교블록 교체)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "src/components/composite/**"
    - "src/pages/CompositeDesign.tsx"
    - "src/lib/**"
    - "src/**/__tests__/**"
    - "tests/e2e/**"
  forbidden_paths:
    - "server/**"
    - "extension/**"
    - ".github/**"
    - "src/config/api.ts"
    - "src/integrations/**"
  commands: ["npx vitest","npx tsc","git"]
  merge_policy: "none"
  ttl_hours: 20
```
> ★ merge_policy=none. base=현 origin/main(#141 포함 — rpComparison.ts·RpComparisonBlocks 존재). **웹앱-only, 서버/캡처/스키마 무변경**(불칸 확인: 데이터 전량 기보유).

## 배경 (회장 PPT 3장 = 최종 설계, agent 미팅 채택)
현 비교블록(RpComparisonBlocks 4개)이 회장 불만족("조회테이블이지 서사가 없음"). 회장이 PPT로 직접 그린 프레젠테이션을 그대로 구현. **계산 로직(rpComparison.ts)은 재활용, UI를 PPT 구조로 교체.** 페이지 세로로 길어져도 OK.

## 정의 lock (ANU 미팅 확정 — 그대로 따를 것)
- **1사 최고/최저** = **완전커버 단일사 총액 max/min**(담보별 envelope 아님). rpComparison.ts computeSingleInsurerTotals 재사용.
- **2·3사 조합** = 선택 N사 내 **담보별 최저 cherry-pick**(기존 dual_best/triple_best.coverages, 담보마다 선택회사 다름).
- **조합 수** = 동적 `C(n,2)+C(n,3)`, n=완전커버 보험사 수(예 10사→45+120=165). 하드코딩 금지.
- **총액차액** = 월차액 × payment_years × 12 (배치1 저장 payment_years, 없으면 20년 가정+플래그). **원단위 총차액 먼저 계산→십만단위 라운딩**(rpComparison.ts 기존 규칙, 월차액 반올림값×개월 금지).

## 작업 — PPT 3장 그대로

### 1장 "AI 복합설계 계산이란?" + 단일담보 비교
- **165조합 인포그래픽**(신규): 10사(실제 n) 중 2개=C(n,2), 3개=C(n,3) 조합, 합쳐 (예)165개를 다 계산해야 함을 도식화. "수동 불가능·AI가 순식간" 메시지. 조합 수는 **동적 산출**(완전커버 n 기반). Matrix/부채꼴 분기 비주얼.
- **고객정보**: 홍길동 · XX세 · YY년납/ZZ세만기 (query_condition: age·payment_years·maturity_age).
- **단일담보(암진단비) 비교 카드**(신규): 대표담보 1개(기본 암진단비=b002, 없으면 선택담보 중 첫째) → **전 보험사 보험료 나열**, **최고=빨강·최저=파랑**, 하단 **월차액** + **YY년납 총액차액(월차액보다 큰 폰트)**. 데이터=analysis_matrix.coverages[cd].premiums(단일담보라 완전커버 제약 없이 per-coverage max/min).

### 2·3장 "전체담보 비교" 표 (핵심)
- 통합 표(또는 PPT처럼 2섹션): **담보명 | 가입한도 | 1사 최고(회사·보험료) | 1사 최저(회사·보험료) | 2사조합(담보별 회사·보험료) | 3사조합(담보별 회사·보험료)**.
  - 각 담보행: 1사최고=완전커버 max사 그 담보 보험료, 1사최저=min사 보험료, 2사=dual_best 그 담보 선택회사·보험료, 3사=triple_best.
  - **합계행(tfoot)**: 상기합계액1(1사최고 총액)·2(1사최저)·3(2사)·4(3사).
- 담보명=배치1 실제이름(코드 노출 0). 가입한도=amount.
- 미제공 담보 = "미취급"(0원 아님) 표기, 최저 판정서 제외.

### 계단식 flow 다이어그램 (핵심 — 회장 강조)
- 세로 계단: **최고Max(L사) 합계액1 → 최저min(M사) 합계액2 → 2사복합(O+P사) 합계액3 → 3사복합(Q+R+S사) 합계액4**.
- 각 계단 사이 **−차액총액**(연속: 1→2, 2→3, 3→4) + **누적 곡선화살표**(1→3, 1→4 등 총 차액).
- 화살표는 **값 비례 아닌 단순 커넥터**(구현 안정). 회사명·합계액 데이터드리븐.
- **단조성 fallback**: 어떤 단계가 이전보다 안 싸지면(2사≥1사min 등) 계단 대신 "이미 최적" 표기(음수 차액 방어).

### 최종 대형문구
- "**최고 Max 보험료와 3개회사 복합설계 최저 min 보험료의 X년간 납입 보험료 총액 차이는 XXXXX원입니다.**" — X=payment_years, XXXXX=합계액1−합계액4(십만단위). **가장 큰 폰트**.

## 폰트·색 (회장 지정)
- **총액차액이 최대 폰트**(월차액·%보다 큼). 최고=빨강/최저=파랑.

## 컴플라이언스 가드 (로키 — 필수)
- **caveat 라벨**(총액차액 같은 시야에): "비갱신형 기준 · 완납 가정(해지/사망 시 상이) · 기준일 YYYY-MM-DD".
- **동일담보 각주**: "동일 담보구성·가입금액 기준. 지급조건·면책·감액은 회사별 상이할 수 있음."
- **인카 근거 각주**(있으면). 어휘 = "차액/차이"(절약·손해·이득 금지).

## 기존 처리
- **RpComparisonBlocks(비교블록 4개) 제거/교체** — 계산 유틸 rpComparison.ts는 재사용(4총액·차액·1사최대). 
- **CompositeComboResult.tsx `240` 하드코딩(line ~153·170 savingAmount*240) → payment_years×12** 수정.
- **신규 UI 요소 전부 `data-testid` 부여** + e2e 로케이터 매트릭스 스코프화(strict-mode 중복 재발 방지). tests/e2e/composite-design-vpath.spec.ts 정합.

## 제약
- webapp-only. 서버/확장 0. 합계·per_insurer·조합·담보별회사는 서버 응답 재사용(재계산 금지, X년 곱·max/min 파생만 웹앱). 반올림 정합.
- 기존 매트릭스·삭제버튼·조합 회귀 0.

## 검증
- `npx tsc` 클린. `npx vitest run` 전체 PASS(회귀 0). 신규: 단일담보 max/min·월차액·YY년총액차액 / 전체담보 표 4열·합계액1~4 / 계단식 4단계·연속차액·단조성 fallback / 최종문구 계산 / 240→payment_years / caveat 렌더 / data-testid 유일성. e2e strict-mode 미발생.
- 반올림: 원단위 총차액→십만라운딩.

## 완료 (★ 순서 B)
- 변경 = src/ (+tests/e2e) 만. 서버/확장 불변.
- **dev6 금지** — dev1. 커밋 → push → finish-task **foreground 1회** → .done 즉시 종료. **background+wait 금지.** ANU 검증(e2e 포함)·Codex 검토·머지·CF Pages 배포는 ANU.
