# task-2867 보고서 — 복합설계 RP 화면 회장 PDF 정합(최소기준) 개선

## Situation
배포된 복합설계 RP(프레젠테이션) 화면이 회장 PDF(`인슈로 복합설계 프리젠테이션 초안`, 기준=최소)
대비 미달·이탈. 회장 확정 지시 8종(A~H) 반영. webapp-only, 서버/확장 무변경, merge_policy=none.

## Complication
- 표시 반올림(roundTo1000/roundTo100000)으로 계단식 스텝합(22.5M)과 헤드라인(22.6M)이 10만원 불일치.
- 계단식이 텍스트 나열(서사 없음), 곡선 화살표의 "1사최고 대비" 의미 미반영.
- 2·3사 조합이 1개 열에 회사명+보험료 뭉침(PDF는 회사별 열 분리).
- 인포그래픽이 의미없는 placeholder 막대, 담보명 코드(a042) 노출, 중복 통합매트릭스 존재.

## Question
회장 PDF를 최소기준으로, 언급된 부분만 정확히 정합시키고 미언급 부분은 현행 유지(과잉수정 금지)하려면?

## Answer (구현 요약 — 8지시 매핑)
- **A. 반올림 전면 제거**: `rpPresentation.ts`·`rpComparison.ts`의 표시 반올림 전부 제거(raw exact 원단위).
  roundTo1000/roundTo100000 헬퍼 완전 삭제(죽은코드 제거). 부수효과로 **계단 스텝합 == 헤드라인이 정확히 일치**(등식 테스트로 검증).
- **B. 계단식 waterfall + 곡선**: 총액 비례 waterfall 계단(1사최고=빨강/최저=파랑/조합=초록) + 직선 화살표(연속 단계차액) + **SVG 곡선 화살표(1사최고 기준 누적)**. cumulative를 single_max 기준 index≥2 전 조합단계로 재정의, `baselineKey` 추가. 라벨 "가장 비싼 곳(1사 최고) 대비 −OOO원".
- **C. 회사별 열 분리**: 신규 `computeComboBreakdown` — 2·3사 각 선택회사를 열 헤더로, 담보별 담당(가장 저렴) 회사 열에만 보험료·타 열 빈칸, 열소계+조합총액. sticky 담보명 + 가로스크롤.
- **D. Matrix 인포그래픽**: placeholder 막대 → 조합 폭발 matrix 도식(동적 C(n,2)+C(n,3), 순수 CSS).
- **E. 담보명 코드노출 제거**: `DisplayCovName` 가드 — 코드패턴(/^[a-z]\d{3}$/)이면 "미분류"+코드 tooltip.
- **F. 만기 표시**: 년납/만기 배지(`rp-maturity`), maturity_age 없으면 graceful 생략.
- **G. 중복 통합매트릭스 제거**: ConsultationHistoryView에서 `CompositeComboResult` 렌더+헤딩 제거(전체담보 표=RP가 상위집합). 타입 import는 유지, 파일 자체 보존.
- **H. "총액 차이" 표기**: 최종문구·곡선 "총액 차이" 사용, "절감/절약" 단어 0건(grep 확인).

## 생성/수정 파일 (전부 src/ + tests/e2e, 서버/확장 무변경)
- `src/lib/rpPresentation.ts` (불칸: A/B/C 로직)
- `src/lib/rpComparison.ts` (불칸: A 로직)
- `src/lib/__tests__/rpPresentation.test.ts` (불칸: 테스트 31)
- `src/lib/__tests__/rpComparison.test.ts` (불칸: 테스트 16)
- `src/components/composite/RpPresentation.tsx` (이리스: B/C/D/E/F/H 렌더)
- `src/components/composite/ConsultationHistoryView.tsx` (이리스: G 제거)
- `src/components/composite/__tests__/RpPresentation.test.tsx` (이리스: 테스트 22)
- `src/components/composite/__tests__/ConsultationHistoryView.test.tsx` (이리스: G 반영 15)
- `tests/e2e/composite-design-vpath.spec.ts` (아르고스: composite-combo-result 제거 반영 + 신규 rp testid)

## 테스트 결과
- `npx tsc --noEmit` → 에러 0 (clean)
- `npx vitest run` (전체) → **65 files, 995/995 PASS**
  - lib: rpPresentation 31 + rpComparison 16 (반올림 exact·계단/헤드라인 등식·breakdown 정합)
  - component: RpPresentation 22 + ConsultationHistoryView 15
- e2e `composite-design-vpath.spec.ts` → **2 passed (9.5s), strict-mode violation 0**

## L1 스모크테스트 결과 (필수)
- **서버 재시작**: 성공 (playwright webServer `npm run dev` @ localhost:8080 자동 기동)
- **API 응답 확인**: 해당없음 (webapp-only, 서버 무변경 — composite-calculate-from-matrix 스텁 기반 V-path e2e)
- **스크린샷**: `tests/e2e/screenshots/vpath/a-3-rp-presentation.png` (280KB, 실렌더 확인)
  - 육안 검증: waterfall 계단(색조 구분)+SVG 곡선("가장 비싼 곳 대비 −1,200,000/−2,400,000원"),
    회사별 열 분리 테이블(담당 열만 보험료·타 열 빈칸), Matrix 인포그래픽, "총액 차이 2,400,000원"(exact),
    통합매트릭스 미표시, "20년납" 배지 모두 정상. raw 코드노출 0(RP 표는 "일반상해").
- 브라우저 정리: playwright auto-close, chrome 좀비 0 확인.

## 발견 이슈 및 해결
- 기존 e2e(414~418행)가 제거된 `composite-combo-result`를 검증 → strict-mode/실패 유발 예상.
  아르고스가 rp-presentation 스코프 기반 검증으로 교체, 회귀 방지. (clean e2e 재실행 2 passed 확인)
- 미해결 이슈 없음.

## 인지 검증 (직접 관찰)
- 반올림 제거를 코드+테스트+스크린샷 3중 확인(1,200,000=5,000×240 exact 렌더 육안 확인).
- G 제거를 `grep "<CompositeComboResult"` 0건 + 스크린샷 미표시로 교차 확인.
- e2e는 task worktree에서 실제 실행(strict-mode 결정적 이슈라 env 무관), 2 passed.

## 머지 판단
- **머지 필요**: No (본 봇 머지 금지 — merge_policy=none, 순서 B)
- **브랜치**: task/task-2867-dev1
- **워크트리 경로**: /home/jay/projects/InsuRo/.worktrees/task-2867-dev1
- **머지 의견**: tsc clean · vitest 995/995 · e2e 2 passed(strict-mode 0) · 스크린샷 육안 정합 확인.
  ANU 독립검증(e2e 포함)·Codex 반증리뷰·머지·CF Pages 배포는 ANU 소유. base=origin/main a8c8843.

## 모델 사용 기록
- 불칸(lib): sonnet — 계산 로직/테스트
- 이리스(컴포넌트): sonnet — React 렌더/테스트
- 아르고스(e2e): sonnet — Playwright 스펙
- 팀장(헤르메스, opus): 설계/분배/검토/통합·검증 (직접 코딩 0)
- haiku 미사용.

## 세션 통계
- 총 도구 호출: 0회

