# task-2872 — RP 화면 3대 교정 (암진단비 항상표시 + 반올림 완전제거 + 회장 PDF SVG 픽셀재현)

- 팀: dev1 (이리스)
- base: origin/main #145 (275351a) · 브랜치: `task/task-2872-dev1` · 커밋 5e316ab
- 범위: webapp-only (`src/**`, `tests/e2e/**` 무변경) · merge_policy=none (검증·머지·배포는 ANU)
- 기준 문서: `memory/tasks/insuro-rp-exact-image-fidelity-260728.md` (sha16 2cb1b6c7251e6600)
- 기준 이미지: `memory/refs/insuro-rp/insuro-rp-revised.pdf`(회장 최종), `insuro-rp-draft.pdf`(암진단비 원형)

## 변경 파일 (4)
- `src/lib/rpPresentation.ts`
- `src/lib/__tests__/rpPresentation.test.ts`
- `src/components/composite/RpPresentation.tsx`
- `src/components/composite/__tests__/RpPresentation.test.tsx`

## A. 단일담보(암진단비) 비교 = 상담 첫 화면, 항상 실제 비교
- lib `computeSingleCoverageCompare`: 대표담보 fallback 강화. 우선순위 b002(암진단비)
  → selectedCds → 캡처 담보 순서. **후보가 회사별 보험료(entries)를 가질 때만 채택**,
  없으면 다음 후보로 넘어가 entries 있는 첫 대표담보를 반드시 선정 → 항상 실제 비교.
- `SingleCoverageCard`: "대표 담보 비교 데이터 없음" 빈메시지 경로 **제거**(진짜 빈
  데이터만 렌더 생략). 초안 PDF 1p 형태 — `<담보 X만원 비교>` 헤더 + 회사명|보험료 표
  (최고=빨강 "최고보험료" / 최저=파랑 "최저보험료") + 월 차액 + **년납 총액 차액(대형)**.
- 위치: 인포그래픽(정적 일반론)·고객정보 다음, 캡처별 동적영역 맨 앞.

## B. 반올림 완전 제거 (회장: "원단위 반올림 하라고 얘기한 적 없어")
- `combinations()` `Math.round` **제거** → 곱-먼저/나눗셈-나중 정수연산으로 exact 조합수
  (n≤10 도메인 부동소수 오차 0). `roundTo1000/roundTo100000`은 이미 제거 상태.
- 계단식의 bar-width `Math.round`(RpPresentation.tsx:331)는 SVG 재현으로 소멸.
- 결과: 컴포넌트/라이브러리 전역 `Math.round`(금액·표시 경로) 0. 표시는
  `toLocaleString('ko-KR')` 천단위 구분만, 값 변경 없음.

## C. 계단식/표 = 회장 수정 PDF SVG 픽셀 재현
- `SectionStaircase`를 단일 SVG 도식으로 재작성:
  - 좌측 파란 라운드 라벨 박스(최고 Max / 최저 min / 2개회사 복합설계 / 3개회사 복합설계, 흰 글씨)
  - 회사명(이탤릭 볼드) + exact 금액(이탤릭 볼드)
  - 연속 단계 사이 파란 굵은 아래화살표 + `− 차액총액`(exact, isOptimal 시 "이미 최적")
  - 우측 직각(ㄱ자) 커넥터: **파랑=최고→2사, 주황=최고→3사**. 곡선(Q/C) 0 — 직선(M/L)만.
  - 회사열/커넥터 라벨 폭 확보(viewW 860)로 3사 조합 회사명·차액총액 라벨 미절단.
- 전체담보 표: 파란 **2단 헤더**(선택시 슈퍼그룹 colSpan + 최고 Max/최저 min/선택N + 회사명).
- 최종 대형문구·삭제버튼·만기칩·인포그래픽 등 기존 기능 전부 유지(임의 삭제 없음).

## 검증
- `npx tsc --noEmit`: exit 0
- `npx vitest run`: **1001/1001 PASS** (66 파일). 신규 단위테스트:
  - B: 조합수 정수연산 정확(n=5→10/10, n=6→15/20, Number.isInteger), 월차액*months===년납총액(반올림 0)
  - A: b002 premiums 비어도 entries 있는 담보 fallback, 빈메시지 미노출, 항상 실제 비교 렌더
  - C: 커넥터 직각 `<path>`(파랑/주황), 곡선 명령 0(assertNoCurvePaths)
- e2e (clean worktree, `CI=1`): **7/7 PASS** (composite-design-vpath 2, crm-customers-vpath 2, keyword 3),
  strict-mode 위반 없음. RP testid(rp-arrow-s1/s2-*, cumulative-*, section-table/sum-*) 전부 유지.
  - ※ 최초 e2e 실패는 clean 워크트리에 `.env` 부재(→ `supabaseUrl is required` 부팅 실패)로 인한
    **환경 이슈**였음(무관 spec도 동일 실패). 저장소 `.env`(gitignore, 미커밋) 공급 후 전부 PASS로 독립 검증.
- 육안 대조: 회장 수정 PDF와 계단식/표/단일담보 카드 일치(스크린샷 a-3-rp-presentation.png 첨부).

## L1 스모크테스트
- 유닛 테스트: `npx vitest run` → **1001 passed** (66 test files, 0 failed) — PASS 확인.
  - RP 전용: `RpPresentation.test.tsx` 23 passed + `rpPresentation.test.ts` 34 passed.
- 타입: `npx tsc --noEmit` → exit 0 확인.
- E2E(실제 브라우저, clean worktree, CI=1): **7 passed** (composite-design-vpath 2 / crm-customers-vpath 2 / keyword 3) — 성공.
- 화면 육안 확인: RP 프레젠테이션 스크린샷 캡처 성공 —
  `tests/e2e/screenshots/vpath/a-3-rp-presentation.png` (스크린샷 첨부).
  단일담보(암진단비형) 비교 카드 항상 렌더, 계단식 SVG(파란 박스·이탤릭 회사명·exact 금액·
  파란 아래화살표·파랑/주황 직각 커넥터, 곡선 0), 파란 2단 헤더 표, 최종 대형문구 — 회장 수정 PDF와 일치 확인.

## 상태
- 커밋·push 완료. finalize-only(merge_policy=none) — PR open, 검증·머지·CF Pages 배포는 ANU.
