# [Lv.3] 웹앱 상담이력 통합 매트릭스 — 담보명·가입한도 왼쪽 1회, 조합은 회사·보험료만 (task-2862 후속)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "src/components/composite/CompositeComboResult.tsx"
    - "src/components/composite/ConsultationHistoryView.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: 14
```
> ★ merge_policy=none. base=**task-2862 머지 후 최신 origin/main**(선행 task-2862의 코드→이름·헤더·plan명·테이블 위에 얹음). webapp-only.

## 배경 (회장 참고테이블 = 오마이매니저 비교표 구조)
task-2862는 1사/2사/3사를 **각각 담보명|가입한도|회사|보험료 테이블**로 만듦. 회장 refinement:
- **담보명·가입한도는 제일 왼쪽에 한 번만** 고정.
- 1사/2사/3사에서는 **담보명·가입한도 중복 표기 제거** — 각 조합은 **회사·보험료만**, **행 정렬**로 어느 담보인지 자명하게.
- 참고: 오마이매니저 비교표(좌측=담보명+가입한도 고정, 각 보험사열=보험료, 상단=합계).

## 목표 구조 — 단일 통합 매트릭스
한 개의 정렬된 표(또는 좌측 고정열 + 조합 컬럼 그룹):
```
| 담보명(좌측고정) | 가입한도 | 1사 최저가        | 2사 조합          | 3사 조합          |
|                  |          | 회사   | 보험료   | 회사   | 보험료   | 회사   | 보험료   |
| 상해후유장해     | 10,000   | 메리츠 | 5,800   | 현대   | 5,280   | ...               |
| 질병후유장해     | 1,000    | 메리츠 | 25,820  | 현대   | 24,113  | ...               |
| ...              | ...      | ...                                                        |
| 월보험료 합계    |          | 274,208(서버 total) | 258,259          | 250,319          |
```
- **행 = 담보(좌측 담보명·가입한도 1회)**. 모든 조합 컬럼이 같은 담보 행에 정렬.
- 각 조합 컬럼 = **회사 · 보험료 2개 서브열만**(담보명/가입한도 반복 금지).
- **맨 아래 월보험료 합계행** = 각 조합의 **서버 total 단일소스**(single_best.total / multi.total). 행 재계산 금지.
- 조합 컬럼 **헤더**에 조합명(1사 최저가/2사 조합/3사 조합) + 보험사 구성(예: "현대해상+농협손해") + **절감 뱃지**(2·3사, 부호정직).
- **20년(240개월) 총 납입보험료 절감액**: 각 조합 컬럼 헤더 또는 합계행 **아래 요약행**에 배치. 순서=월보험료 합계(위) → 20년 총절감(아래).

## 제약·정합
- task-2862 산출물(코드→이름 resolveCoverageName, plan_name 헤더, 선택담보 테이블) **유지·재사용**. 선택담보 테이블(담보명|가입한도)은 그대로 두고, **최적조합 부분만 통합 매트릭스로**.
- 가입한도·회사·보험료 데이터는 서버 응답에 이미 존재. 없는 셀 "-" graceful.
- 담보 정렬 순서: 선택담보/1사 배정 순서를 기준축으로(모든 조합 동일 담보축에 정렬). 특정 조합에 없는 담보 셀은 "-".
- 반응형: 컬럼 많아지면 가로 스크롤(overflow-x auto). 좌측 담보명·가입한도 열 **sticky**(가로 스크롤 시 고정) 권장.
- 절감 부호 정직(>0 절감/=0 동일/<0 비쌈), 기존 카드 숨김 규칙 의미변경 금지.
- 서버/확장 변경 0.

## 검증
- `npx tsc` 클린. 컴포넌트: 통합표 구조(좌측 담보명·가입한도 1회 / 조합별 회사·보험료 서브열 / 합계행=서버total / 20년절감 합계 아래) / 담보축 정렬(조합간 같은 담보 같은 행) / 없는 셀 "-" / 가로스크롤·sticky. 기존 조합/vpath e2e 회귀 0. task-2862 코드→이름·plan명 회귀 0.

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