# DSN-01 · 6 Layer Dashboard 메인 — 디자인 명세

> 본 문서는 `design/01_dashboard_main.html` 정적 시안의 명세이다. CLI(Claude Code) 구현 단계에서 평가엔진(F1) 산출물을 이 화면에 매핑할 때 참조한다. 알고리즘·로직 구현은 별도 진행.

## 1. 목적과 사용자

| 항목 | 값 |
|---|---|
| 화면 ID | DSN-01 / dashboard-main |
| 연계 알고리즘 | F1 (6 Layer 통합 평가 → 인수가 권고) |
| 1차 사용자 | Bobot 인수팀 리드 (대표·CFO·DD 담당) |
| 2차 사용자 | 외부 자문(보험계리사·법무) — PDF 내보내기로 공유 |
| 핵심 결정 | "이 GA 책(Type I)을 얼마에 살 것인가, 또는 패스할 것인가" |
| 첫 0.5초 인지 목표 | 인수가 권고 중앙값 + 권고 방향(Buy/Hold/Pass) |

## 2. 화면 영역 구성 (위→아래)

| 영역 | 컴포넌트 | 데이터 소스 | 비고 |
|---|---|---|---|
| Sidebar | 8 메뉴 (평가 4 / 딜플로우 2 / 관리 2) | 정적 | 본 화면은 "6 Layer Dashboard" active |
| Topbar | breadcrumbs + 액션 2개(PDF 내보내기 · Stage 0 보고서) | 정적 + 책 ID | Stage 0 보고서는 08_ 산출물 트리거 |
| Input bar | 책 ID · 평가 기준일 · 모델 버전 · 채권 타입 · 재평가 버튼 | 사용자 입력 | 책 ID는 B3 후보 풀에서 선택(검색 자동완성) |
| Scenario bar | 3-state 토글(낙관/기준/비관) + 모델 메타 + 데이터 신뢰도 태그 | F1 출력 | 토글은 hero/Layer/하단 표 모두 갱신 |
| Recommendation hero | 권고 중앙값 + 레인지 트랙 + 4 stat | F1 출력 | 가장 중요한 영역. 그라디언트 hero color |
| 6 Layer grid | 3×2 카드 (Layer 1~6) | Layer별 출력 | Layer 6 spotlight 처리 (Bobot 고유) |
| Bottom panel · 가정 | 5행 가정 표 + 민감도 | 모델 메타 | WACC, 1200% 룰, Trail 시점 등 |
| Bottom panel · 액션 | 5개 체크리스트 | 자동 생성 + 수동 | 결과 점수 따라 액션 동적 |
| Doc note | 시안 안내 문구 | 정적 | brand-dna 확정 시 제거 가능 |

## 3. 데이터 계약 (CLI 구현 시 매핑)

```jsonc
// GET /api/v1/evaluation/:book_id?as_of=2026-12-01&model=v0.4&type=I
{
  "book_id": "BK-2026-014",
  "ga_label": "후보 GA #14",          // 익명화 라벨
  "as_of": "2026-12-01",
  "model_version": "v0.4",
  "bond_type": "I",                   // I | II | III
  "scenarios": ["optimistic","base","pessimistic"],
  "recommendation": {
    "verdict": "BUY",                 // BUY | HOLD | PASS
    "price_median_kr": 3_840_000_000, // 38.4억
    "price_band_kr": [3_200_000_000, 4_500_000_000],
    "scenario_band_kr": [2_000_000_000, 5_800_000_000],
    "verdict_reason": "유지율 + 부활 풀 동시 강세"
  },
  "summary_stats": {
    "agent_count": 312,
    "active_contracts": 28460,
    "monthly_premium_kr": 860_000_000,
    "retention_25m_pct": 0.812,
    "retention_25m_vs_industry_pp": 0.034,
    "score_total": 72,
    "score_delta_vs_prev": 4
  },
  "layers": [
    {
      "id": 1, "name": "유지율 곡선", "status": "STRONG",
      "value": 0.812, "unit": "% · 25회차 conditional",
      "meter_pct": 81, "tone": "ok",
      "desc": "...", "input_source": "보험개발원·금감원",
      "footnote": "백테스트 오차 ±13.2%"
    },
    /* Layer 2: WARN (부당승환), 3: STRONG (HHI), 4: SIM (Lift),
       5: WARN (통합비용 변동), 6: STRONG · spotlight (부활 풀) */
  ],
  "assumptions": [
    {"key":"WACC","value":"기준 8.5%","sensitivity":"±1%p → ±2.4억"},
    {"key":"1200%_rule_start","value":"2027.07 가정","sensitivity":"3개월 변동 → ±0.8억"},
    {"key":"trail_transferable","value":"샌드박스 통과 후","sensitivity":"고정 (Type II)"},
    {"key":"reinstatement_rate","value":"6.4% (v0)","sensitivity":"±2%p → ±3.1억"},
    {"key":"backtest_error","value":"±13.2%","sensitivity":"+15% 초과 시 보류"}
  ],
  "next_actions": [
    {"label":"Layer 1~3 통합 점수 계산","done":true},
    {"label":"시나리오 3종 NPV 산출","done":true},
    {"label":"Layer 4 시뮬 신뢰도 확보 — 보험계리사 검증","done":false,"priority":"P0"},
    {"label":"Stage 0 인수 LOI 초안 작성 (38.4억 ±20%)","done":false,"priority":"P1"},
    {"label":"샌드박스 컨셉 페이퍼 §4 평가 사례에 익명화 첨부","done":false,"priority":"P2"}
  ],
  "data_confidence": "MEDIUM"          // HIGH | MEDIUM | LOW
}
```

### 시나리오 토글 동작
- `?scenario=base` 쿼리로 hero/layer/assumptions의 수치를 함께 갱신
- 클라이언트 사이드 토글이면 3 시나리오를 한번에 받아 캐시(권장: SWR)

## 4. 디자인 토큰 (`:root`)

본 시안은 brand-dna.json 미확정 단계의 **임시 토큰**을 사용한다. 확정 후 `<style>:root` 변수만 치환:

| 토큰 | 임시값 | brand-dna 매핑 |
|---|---|---|
| `--hero` | `#1F4E79` | `design_tokens.colors.hero` |
| `--accent` | `#2E844A` | `design_tokens.colors.success` |
| `--warn` | `#B95000` | `design_tokens.colors.warn` |
| `--danger` | `#BA0517` | `design_tokens.colors.danger` |
| `--font-body` | Pretendard 우선 | `design_tokens.typography.font_body` |
| `--font-mono` | JetBrains Mono | `design_tokens.typography.font_mono` |
| `--r-md` | 10px | `design_tokens.shape.radius` (moderate) |

## 5. 상태/상호작용 명세

| 컴포넌트 | 상태 | 처리 |
|---|---|---|
| 책 ID 인풋 | 비어있음 | `placeholder="검색: GA 이름·코드·후보번호"`. 재평가 버튼 disabled |
| 책 ID 인풋 | 비매칭 | `aria-invalid` + `--danger` 보더 + hint "후보 풀에서 찾을 수 없음" |
| 재평가 버튼 | 진행중 | 버튼 텍스트 → "평가 중..." + 스피너. hero/layer 영역 skeleton |
| 재평가 버튼 | 모델 v0 | hero에 노란 배너 "v0 모델 — 외부 검증 전. 외부 신청서 활용 금지" |
| 시나리오 토글 | 변경 시 | hero/layer/assumptions 동시 갱신. URL `?scenario=` 업데이트 |
| 데이터 신뢰도 | LOW | 빨간 배지 + hero에 추가 경고 + "보고서 생성" 버튼 disabled |
| Layer 카드 hover | - | `translateY(-2px)` + shadow-md. 과한 모션 금지 |
| Layer 카드 클릭 | - | DSN-02(Layer 1) / 향후 Layer별 상세 화면으로 이동 |
| PDF 내보내기 | - | 현재 화면을 A3 가로 1p로 캡처 (외부 자문 공유용) |
| Stage 0 보고서 생성 | - | 08_Stage0_Deal_평가보고서.md 트리거 |

## 6. 가독성·접근성 (slds-ui-readability 룰 적용)

- ✅ 다크 hero 위 텍스트는 `--text-inverse` 명시
- ✅ form 필드 보더 `--border-strong` (1px) — 회색 음영만으로 표현 금지
- ✅ 배지/필 항상 텍스트 + 색상 동시 사용 (색맹 대응)
- ✅ 카드 보더 1px 명시 (그림자만으로 경계 표현 금지)
- ✅ 키보드 포커스: 인풋·셀렉트·버튼 모두 `:focus` 시 outline 3px 청색 ring
- ✅ font-size body 14px / micro 11px (절대치 11px 이하 금지)

## 7. 화면당 주요 CTA

`brand-dna.user_decision_clarity` 룰 — 화면당 주요 CTA 1개 이상.

- **주요 CTA**: 우측 상단 "Stage 0 보고서 생성" (점수 ≥70 + 데이터 신뢰도 MEDIUM↑일 때 활성)
- **보조 CTA**: "PDF 내보내기" (외부 자문 공유)
- **운영 CTA**: input-bar의 "재평가 실행"

## 8. 익명화 규약 (전역 CLAUDE.md)

- GA 실명·인수가·보험사 협상 내용은 **이 화면 데이터로 직접 노출 금지**
- API 응답에서 `ga_label`은 항상 "후보 GA #N" 또는 별칭. 실명은 별도 권한 토큰 필요
- PDF 내보내기는 익명화 모드 default. 실명 모드는 별도 확인 다이얼로그 후 활성

## 9. 향후 종속 화면

| 화면 | ID | 트리거 |
|---|---|---|
| Layer 1 유지율 곡선 상세 | DSN-02 / ISS-043 | Layer 1 카드 "상세 보기 →" |
| 시나리오 비교 (3-up NPV) | DSN-03 / ISS-045 | Scenario bar에서 "비교 모드" 추가 진입 |
| GA Watch List | DSN-04 / ISS-047 | Sidebar "GA Watch List" |
| Fair Value 산정 흐름 | DSN-05 / ISS-049 | Sidebar "Fair Value 산정 흐름" |

## 10. v0 → v1 변경 예정

- [ ] brand-dna.json 확정 후 토큰 일괄 교체 (DSN-00 완료 의존)
- [ ] Layer 카드 sparkline 추가 (Layer 1: vintage별 곡선 미니 / Layer 4: 시뮬 분포)
- [ ] hero card에 "권고 vs 시장 평균" 비교 띠 추가
- [ ] 데이터 신뢰도 LOW 케이스의 차단 UX 보강 (모달)
- [ ] 다국어 (외부 자문 영어 보고용)

## 11. 핸드오프 체크리스트

CLI 구현팀(Claude Code)이 본 시안을 받아 진행할 때:

- [ ] 위 §3 데이터 계약을 백엔드 응답 스키마와 매핑
- [ ] `:root` CSS 변수만 분리해서 `app/assets/stylesheets/tokens.css`로 추출
- [ ] 시나리오 토글은 클라이언트 캐시 (3 시나리오 동시 fetch)
- [ ] PDF 내보내기는 wkhtmltopdf 또는 Puppeteer A3 가로 1p
- [ ] 책 ID 자동완성은 GA Watch List(DSN-04) 데이터 재활용
- [ ] 데이터 신뢰도 LOW일 때 보고서 생성 버튼 비활성화 검증
