# PR #78 (task-2346) CompositeDesign 흰화면 fix — rebase + 머지

## 작업 레벨: Lv.1 (1일 묵은 OPEN PR rebase)

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`
- 핵심 파일: `src/pages/CompositeDesign.tsx` (라다가 작성한 1파일 fix)

## 배경

### PR #78 현황 (1일 묵음)
- **Title**: `[task-2346] 라다: CompositeDesign 흰화면 fix (응답 정규화 + null-safety)`
- **Author**: 라다 (dev6)
- **Created**: 2026-05-01 17:47 UTC
- **State**: OPEN
- **mergeable**: CONFLICTING (DIRTY)
- **ci**: FAILURE (main 자체 회귀 가능성, task-2376/keyword_pool 잔존)

### 사고 패턴 — task-2378(InfoKeyword)과 동일

회장님이 직접 보신 흰 화면 패턴:
- task-2378 (5/2 머지): `/keyword-analysis?tab=info-keyword` React #31 (`{keyword, tier}` 객체)
- **task-2346 (PR #78, 5/1 OPEN)**: `/composite-design` "최적 조합 계산" 흰 화면

→ 둘 다 **백엔드 응답 정규화 + null-safety 부재** 패턴. 같은 카테고리의 회귀.

### 회장 결정 (2026-05-02 일괄 처리 패키지)

> "D (PR #78 → dev6 위임) — CompositeDesign도 같은 패턴 회귀이므로 fix 가치 있음"

## 작업 범위

### 1. PR #78 rebase

```bash
cd /home/jay/projects/InsuRo
git fetch origin main
git checkout task/task-2346-...   # 라다의 원 브랜치
git rebase origin/main
# conflict 발생 시 해결 (라다 본인이 작성했으므로 의도 알고 있음)
git push --force-with-lease
```

### 2. ci 회귀 확인

main의 ci 실패 원인을 확인:
- task-2376 fix는 머지됨 (verify_admin 401→403)
- 잔존: `test_blocks_recruitment_keyword` (BLOCKLIST 회귀)는 별개 task로 분리 보류 중

PR #78이 **server 변경 0**이면 본 PR은 main ci 회귀와 무관. admin override 머지 가능 (task-2378 머지 시도했던 패턴 재사용).

### 3. CompositeDesign 변경 검토 (PR #78 본 내용)

라다가 작성한 fix 요약 (PR description 인용):
- 백엔드 raw 타입 (`BackendBest` / `BackendCalcResult`) 추가
- `normalizeBest(raw, label, coverageNameMap)` 헬퍼 (`single_best`/`dual_best`/`triple_best` → `CompositeCard`)
- `useMemo`로 `coverage_cd → coverage_name` 룩업 dict
- `handleCalculate`: `await res.json()` 명시적 try → 파싱 실패 catch + toast
- `CalcResult` 타입: `CompositeCard | null` 3개로 변경
- `ResultCard`: 모든 필드 옵셔널 체이닝 + 기본값
- 결과 영역: 카드 배열 필터링, 빈 배열 시 "데이터 부족" 안내

→ task-2378 (InfoKeyword) fix와 같은 응답 정규화 패턴.

### 4. 회귀 검증 + 빌드

```bash
cd /home/jay/projects/InsuRo
npm run build         # 0 error 확인
npm test              # vitest 회귀 0
npm run e2e           # Playwright (CompositeDesign 시나리오 영향 확인)
```

### 5. 머지 + Vercel 배포

- ci 회귀가 본 PR과 무관하면 admin override 머지
- Vercel 자동 배포 + SW 캐시 회피
- 회장님께 완료 보고

## 검증 시나리오

1. **흰 화면 차단**: `/composite-design` "최적 조합 계산" 클릭 → 결과 카드 정상 표시 (또는 "데이터 부족" 메시지)
2. **null-safety**: 백엔드 응답 일부 null이어도 흰 화면 안 됨 (옵셔널 체이닝)
3. **응답 형식 mismatch**: 백엔드 schema 변경됐어도 normalizeBest가 흡수
4. **타입 안전**: `npm run typecheck` 0 error
5. **vitest 회귀 0**: 다른 페이지 테스트 PASS
6. **rebase 깔끔**: conflict 해결 후 main 흐름과 정합
7. **PWA 캐시 회피**: 빌드 산출물 hash 변경 + SW 재등록

## affected_files

### 수정 (라다가 이미 작성)
- `src/pages/CompositeDesign.tsx`

### 추가 변경 가능 (rebase 시 conflict 해결 필요할 수도)
- 인접 타입 파일 (필요 시 최소만)

### 변경 금지
- `src/pages/InfoKeyword.tsx` (task-2378 산출물 보존)
- `src/pages/KeywordAnalysis.tsx`
- `src/pages/AdminInfoKeyword.tsx`
- `tests/e2e/composite-design-phase3.spec.ts` (Phase 4 산출물)
- `tests/e2e/composite-design-phase5-tab.spec.ts` (Phase 5 산출물)
- `tests/e2e/fixtures/**` (Phase 4/5 fixture)
- `playwright.config.ts`, `vitest.config.ts`
- `extension/**` (Phase 5 산출물)
- `.github/workflows/**` (task-2372 산출물)
- `server/main.py` (task-2376 산출물)
- `server/customer_match.py` (Phase 3 산출물)
- `server/composite_calculator.py` (Phase 4 산출물)
- `supabase/migrations/**`

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "src/pages/CompositeDesign.tsx"
    - "src/types/**"
    - "memory/plans/tasks/task-XXXX/**"
    - "memory/reports/task-XXXX-pr78-compositedesign-rebase.md"
  forbidden_paths:
    - "src/pages/InfoKeyword.tsx"
    - "src/pages/KeywordAnalysis.tsx"
    - "src/pages/AdminInfoKeyword.tsx"
    - "tests/e2e/**"
    - "playwright.config.ts"
    - "vitest.config.ts"
    - "extension/**"
    - ".github/**"
    - "server/main.py"
    - "server/customer_match.py"
    - "server/composite_calculator.py"
    - "supabase/**"
  commands:
    - "npm run build"
    - "npm test"
    - "npm run typecheck"
    - "npm run e2e"
    - "git rebase"
    - "git push"
    - "gh pr"
  merge_policy: "tiered"  # Lv.1 → Tier 1 자동 또는 1-tap
  ttl_hours: 6
```

## 작업 원칙
- **Think Before Coding**: 라다 본인이 작성한 PR이므로 의도 알고 있음. rebase 시 conflict 해결 자신 있음
- **Simplicity First**: PR #78 그대로 + main rebase만. 추가 fix 추가 금지
- **Surgical Changes**: CompositeDesign.tsx 1파일 위주
- **Goal-Driven**: PR #78 머지 = 성공

## 보고

- `memory/reports/task-XXXX-pr78-compositedesign-rebase.md`
- 7가지 검증 시나리오 PASS/FAIL 매트릭스
- rebase conflict 해결 내역 (있다면)
- 빌드 + 배포 + 실 브라우저 E2E 결과

## 운영 메모

### 시급도
- 6h TTL (시급 — 흰 화면 사용자 영향)

### 의존성
- task-2376 (server CI fix) ✅ 머지 완료
- task-2378 (InfoKeyword 흰화면) ✅ 머지 완료 — **같은 패턴 fix 참고 가능**
- 다른 활성 task 영역 충돌 0

### 위임 후보
- **dev6 (라다)** — PR #78 본인이 작성 + 컨텍스트 100% 보유 ⭐ 1순위
- 만약 dev6가 다른 작업 중이면 **dev1 (헤르메스)** 풀스택 fallback

### 회장 승인 게이트
- ★ Tier 1 자동 또는 1-tap (Lv.1 단순 rebase + 머지)
- 머지 후 Vercel 자동 배포 + SW 캐시 회피 가이드 회장님께 보고

### finish-task.sh
- ★ 마지막 단계 finish-task.sh 실행 절대 누락 금지

## 참조

- 회장 결정: 2026-05-02 "D (PR #78 → dev6 위임) — CompositeDesign도 같은 패턴 회귀이므로 fix 가치 있음"
- task-2378 보고서 (참고): `memory/reports/task-2378.md`
- task-2376 보고서 (server CI fix): `memory/reports/task-2376.md`
- PR #78 GitHub: https://github.com/JonghyukJeon/InsuRo/pull/78

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