# DSN-03 · 시나리오 비교 (G1) — 디자인 명세

> 본 문서는 `design/03_scenario_compare.html`의 명세이다. G1 알고리즘(낙관/기준/비관 NPV 계산)의 시각화 핸드오프 문서.

## 1. 목적

| 항목 | 값 |
|---|---|
| 화면 ID | DSN-03 / scenario-compare |
| 연계 알고리즘 | G1 — 3 시나리오 NPV + 드라이버 분해 + Tornado 민감도 |
| 1차 사용자 | Bobot 인수팀 리드, CFO |
| 2차 사용자 | 투자 위원회·외부 자문 (PDF 출력으로 공유) |
| 핵심 결정 | "이 GA를 비관 시나리오에서도 한도 내로 살 수 있는가? 낙관일 때는 Stage 1로 넘겨야 하는가?" |
| 첫 0.5초 인지 목표 | 3 시나리오 NPV가 Stage 0 한도(30~50억) 안인지 밖인지 |

## 2. 화면 영역

| 영역 | 컴포넌트 |
|---|---|
| Sidebar | DSN-01과 동일 ("시나리오 비교" active) |
| Topbar | breadcrumb + ← Dashboard / PDF 내보내기 / 시나리오 편집 |
| Meta bar | 책 ID + 모델 메타 + Stage 0 한도 경고 + 갱신 시각 |
| Stage 0 ceiling card | NPV 마커 3개를 30~50억 한도 띠 위에 겹친 가로 트랙 |
| 3-up 시나리오 카드 | 비관 / 기준 / 낙관 — 각각 NPV + 5 드라이버 + verdict |
| Driver decomposition | 6 드라이버 × 3 시나리오 표 + NPV 합계 행 |
| Tornado | 6 변수 ±1σ 영향 (위→아래 영향력 큰 순) |
| Doc note | 시안 안내 |

## 3. 데이터 계약

```jsonc
// GET /api/v1/evaluation/:book_id/scenarios
{
  "book_id": "BK-2026-014",
  "model_version": "v0.4",
  "as_of": "2026-12-01",
  "wacc": 0.085,
  "stage0_ceiling_kr": [3_000_000_000, 5_000_000_000],

  "scenarios": [
    {
      "id": "pessimistic",
      "label": "Pessimistic",
      "probability": 0.25,
      "npv_kr": 2_240_000_000,
      "delta_vs_base_kr": -1_600_000_000,
      "drivers": {
        "retention_25m": 0.742,
        "rule_1200_start": "2027-04",
        "anti_switch_impact_pp": -0.042,
        "reinstatement_rate": 0.030,
        "integration_cost_kr": 740_000_000
      },
      "verdict": {
        "in_stage0_range": true,
        "recommendation": "STAGE0_CONDITIONAL",
        "note": "22억 LOI 가능 · 데이터 보강 후 재평가 필수"
      }
    },
    {
      "id": "base",
      "label": "Base Case",
      "probability": 0.50,
      "npv_kr": 3_840_000_000,
      "drivers": { /* ... */ },
      "verdict": {
        "in_stage0_range": true,
        "recommendation": "STAGE0_BUY",
        "note": "Stage 0 권고: 38.4억 ±20%"
      }
    },
    {
      "id": "optimistic",
      "label": "Optimistic",
      "probability": 0.25,
      "npv_kr": 5_680_000_000,
      "drivers": { /* ... */ },
      "verdict": {
        "in_stage0_range": false,
        "recommendation": "STAGE1_OR_SPLIT",
        "note": "Stage 0 한도 초과 · Stage 1 분할 또는 Trail 분리 검토"
      }
    }
  ],

  "driver_decomposition": {
    "drivers": [
      {"key":"layer1_retention",   "label":"Layer 1 — 유지율 NPV",      "values_kr":[1_820, 2_680, 3_640]},
      {"key":"layer6_reinst",      "label":"Layer 6 — 부활 풀 NPV",      "values_kr":[340, 970, 1_520]},
      {"key":"layer4_lift",        "label":"Layer 4 — 운영효율 Lift",     "values_kr":[210, 340, 570]},
      {"key":"layer2_anti_switch", "label":"Layer 2 — 부당승환 차감",      "values_kr":[-420, -240, -120]},
      {"key":"layer5_integration", "label":"Layer 5 — 통합비용",          "values_kr":[-740, -580, -450]},
      {"key":"wacc_effect",        "label":"WACC 변동 (할인 효과)",       "values_kr":[-200, 0, 160]}
    ],
    "totals_kr": [2_240, 3_840, 5_680],
    "scenario_order": ["pessimistic","base","optimistic"]
  },

  "sensitivity_tornado": [
    {"key":"retention_25m",       "label":"25회차 유지율 (±5%p)",       "impact_kr": 920},
    {"key":"reinstatement_rate",  "label":"부활 행사율 (±2%p)",         "impact_kr": 640},
    {"key":"wacc",                "label":"WACC (±1%p)",                "impact_kr": 480},
    {"key":"integration_cost",    "label":"통합비용 (±20%)",            "impact_kr": 290},
    {"key":"rule_1200_timing",    "label":"1200% 룰 시점 (±3개월)",     "impact_kr": 200},
    {"key":"anti_switch_flags",   "label":"부당승환 플래그 (±5건)",     "impact_kr": 120}
  ]
}
```

## 4. 시나리오 카드 — 색상·verdict 룰

| 시나리오 | 색상 | verdict 케이스 |
|---|---|---|
| Pessimistic | --pess (오렌지) | 한도 안 → "조건부 LOI 가능" / 한도 밖 → "Pass 권고" |
| Base | --base (블루) — 강조 카드 (border + shadow-md) | 한도 안 → "✅ 권고" / 한도 밖 → "Stage 1 검토" |
| Optimistic | --opt (그린) | 한도 안 → "기회 — 빠른 진행" / 한도 밖 → "Stage 1 분할 또는 Trail 분리" |

확률(p)은 카드 우측 상단 pill로 표시. 합 = 1.0 (백엔드 검증).

## 5. Stage 0 ceiling card — 시각 룰

- 한도 띠(30~50억)는 노란-오렌지 그라디언트 + dashed 보더
- NPV 마커 3개는 시나리오 색상 + label
- 한도 트랙의 X 범위는 0~80억 고정 (시각 일관성)
- 모든 시나리오가 한도 밖이면 → "전 시나리오 한도 외 — Stage 0 부적합" 빨간 배너 추가 (현 시안에는 없음, 구현 시 조건부 추가)

## 6. Tornado — 시각 룰

- bar 폭 = 영향 크기 / 최대 영향 × 50% (반쪽 기준)
- 음(왼쪽) = 변수 ↓ 시 NPV 감소 = 오렌지
- 양(오른쪽) = 변수 ↑ 시 NPV 증가 = 그린
- 위에서 아래로 영향력 큰 순 정렬

## 7. 상호작용

| 트리거 | 동작 |
|---|---|
| 시나리오 카드 hover | 해당 시나리오 색상으로 ceiling 마커 강조 |
| 드라이버 행 hover | 해당 행만 색상 진하게 |
| Tornado bar 클릭 | 해당 변수에 대한 sensitivity 상세 모달 (v1) |
| 시나리오 편집 클릭 | 모달 → 시나리오별 5 드라이버 값 직접 입력 → NPV 재계산 |
| PDF 내보내기 | 현재 화면 A3 가로 1p (외부 자문 공유) |
| Stage 0 부적합 케이스 | 상단 빨간 배너 + Dashboard "보고서 생성" 버튼 비활성 |

## 8. 가독성·접근성

- ✅ 시나리오 색상은 라벨/배지/보더 3중 표기 (색맹 대응)
- ✅ NPV 숫자는 mono font + 32px (강조)
- ✅ Stage 0 한도 띠는 색상 + dashed 보더 + 라벨 3중
- ✅ Tornado bar는 색상 + 라벨 텍스트 + 절댓값 동시
- ✅ 드라이버 표는 차이 폭(`비관 → 낙관`) 명시 → 영향력 직관 파악

## 9. 디자인 토큰 (DSN-01과 공유 + 신규 3개)

```css
--opt:  #2E844A;   /* 낙관 그린 */
--base: #1F4E79;   /* 기준 블루 (= --hero) */
--pess: #B95000;   /* 비관 오렌지 (= --warn) */
```

향후 brand-dna.json에 `scenario_palette: { optimistic, base, pessimistic }` 추가 권장.

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

- [ ] §3 응답 스키마 OpenAPI 작성
- [ ] 확률가중 검증 (Σp = 1.0)
- [ ] 시나리오 편집 모달 (v1) — 드라이버 직접 입력 + 즉시 재계산 fetch
- [ ] PDF는 A3 가로 1p, 시나리오 카드 폭 균등
- [ ] Stage 0 한도 외 케이스의 자동 메시지 룰 백엔드 정의
- [ ] Tornado는 ±1σ가 아닌 시나리오 폭(비관→낙관)으로 표시할지 옵션화
