# DSN-04 · GA Watch List (B3) — 디자인 명세

> 본 문서는 `design/04_watchlist.html`의 명세이다. B3(raw 76곳 → 압축 30곳) 후보 GA 모니터링 화면.

## 1. 목적

| 항목 | 값 |
|---|---|
| 화면 ID | DSN-04 / watchlist |
| 연계 단계 | B3 — 30곳 압축 후보 + 자금난 신호 모니터링 |
| 1차 사용자 | Bobot 인수팀 (딜 소싱 담당) |
| 핵심 결정 | "오늘 누구를 우선 접촉할 것인가?" + "자금난 신호 GA 중 Stage 0 후보로 격상할 곳은?" |
| 첫 0.5초 인지 목표 | 자금난 신호 발현 GA 수 + 우선 접촉 권장 행 (priority highlight) |

## 2. 화면 영역

| 영역 | 컴포넌트 | 비고 |
|---|---|---|
| Sidebar | DSN-01과 동일 ("GA Watch List" active) | |
| Topbar | breadcrumb + CSV 내보내기 / 필터 저장 / 신규 GA 추가 | "신규 GA"는 raw list에서 30곳에 추가 |
| KPI 4-up | 총원 / 자금난 신호 / DD 진행 / 평균 6 Layer 점수 | |
| Toolbar | 검색 + 단계 segmented (전체/Stage0/접촉/관망) + 필터 칩 | |
| 테이블 | 10열 × 페이지당 10행. 우선접촉 행은 priority 배경 | |
| 페이저 | 1~3 페이지 + 요약 텍스트 | |
| Doc note | 시안 안내 + 익명화 규약 |

## 3. 데이터 계약

```jsonc
// GET /api/v1/watchlist?stage=&signal=&min_retention=&query=&page=
{
  "total": 30,
  "summary": {
    "total": 30,
    "with_distress_signal": 7,
    "in_dd": 3,
    "in_loi": 1,
    "stage0_candidates": 8,
    "avg_layer_score": 68,
    "avg_layer_score_delta_mom": 2.4
  },
  "items": [
    {
      "id": "BK-2026-014",
      "label": "후보 GA #14",
      "size": "medium",         // small | medium | large
      "region": "capital",      // capital | gyeongbuk | jeonla | chungcheong | gangwon
      "agent_count": 312,
      "retention_25m": 0.812,
      "retention_25m_tone": "ok",  // ok | warn | danger
      "trend_monthly": [0.78, 0.79, 0.80, 0.80, 0.81, 0.81, 0.812, 0.815],
      "trend_tone": "up",       // up | flat | down
      "distress_signals": [
        {"key":"capital_impair","label":"자본잠식","severity":"danger"},
        {"key":"ceo_change",   "label":"대표교체","severity":"warn"}
      ],
      "layer_score": 72,
      "layer_score_tier": "high",  // high (70+) | mid (60-69) | low (50-59) | poor (<50)
      "deal_stage": "dd",          // observe | contact | dd | loi | passed
      "last_contact_at": "2026-05-02",
      "last_contact_note": "3차 미팅",
      "is_priority": true          // priority highlight 행 여부
    }
    /* ... */
  ],
  "page": 1,
  "page_size": 10,
  "total_pages": 3
}
```

## 4. 필터·검색

| 필터 | 값 |
|---|---|
| 검색 | id, label, region (서버측 ILIKE) |
| 단계 segmented | 전체 / Stage 0 후보 / 접촉 중 / 관망 |
| 필터 칩 (다중) | 자금난 신호 ON / 유지율 80%+ / 설계사 100~500 / 권역별 |
| 정렬 | 기본: priority desc → layer_score desc → last_contact_at asc |

URL: `?stage=&signal=true&min_retention=0.8&size=medium&region=capital&q=...`

## 5. 자금난 신호 카탈로그

| key | label | severity | 출처 |
|---|---|---|---|
| `capital_impair` | 자본잠식 | danger | 공시·재무제표 |
| `loan_default` | 대출연체 | danger | 신용평가사 |
| `agent_outflow` | 설계사이탈 | warn/danger | 설계사 등록 변동 모니터링 |
| `ceo_change` | 대표교체 | warn | 등기·뉴스 |
| `regulatory_action` | 제재·과징금 | danger | 금감원 발표 |
| `revenue_drop` | 매출 급락 | warn | 분기 공시 |
| `model_score_70+` | 평가 모델 70+ | info (긍정) | 내부 산출 |

신호 chip은 한 행당 최대 3개 표시. 더 있으면 `+N` chip.

## 6. 딜 단계 정의

| key | label | 색상 | 의미 |
|---|---|---|---|
| `observe` | 관망 | mute | 모니터링만 |
| `contact` | 접촉 중 | hero blue | 1~2차 미팅 |
| `dd` | DD 진행 | accent green | Due Diligence 중 |
| `loi` | LOI 검토 | warn orange | Letter of Intent 작성 |
| `passed` | Pass | mute (gray) | 부적합 판정 |

## 7. 행 액션

| 아이콘 | 동작 |
|---|---|
| ⇧ | 우선접촉 격상 (priority=true 토글) |
| ▦ | DSN-01 평가 화면으로 이동 (?book_id=...) |
| ✎ | 인라인 메모 모달 |

벌크 액션 (체크박스 선택 시 toolbar에 노출):
- 단계 일괄 변경 (관망 → 접촉)
- 자금난 신호 일괄 무시
- CSV 추출

## 8. 가독성·접근성

- ✅ priority 행은 배경색 + 좌측 3px 보더 (색상만 의존 X)
- ✅ 신호 chip은 색상 + 텍스트 + dot (3중 표기)
- ✅ 유지율 셀은 색상 + bold 글꼴 (색맹 대응)
- ✅ sparkline 옆에 추세 chip 추가하면 더 좋음 (v1)
- ✅ 마우스 hover 시 행 강조, 키보드 ↑↓로도 행 이동 (v1)
- ✅ 데스크톱에서 "월간 추세" + "자금난 신호" 열만 1180px 미만에서 숨김 (스크롤 회피)

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

- 모든 GA 이름은 "후보 GA #N" 라벨로 표시
- 권한 토큰 보유자가 "실명 모드 전환" 클릭 시 → 확인 다이얼로그 → 라벨 → 실명 + audit log 기록
- CSV 내보내기는 익명화 모드 default. 실명 export는 별도 권한 + 워터마크
- 자금난 신호의 출처(특정 뉴스 기사 등)는 메모 모달에서만 표시, 테이블에 직접 표시 금지

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

- [ ] §3 응답 스키마 OpenAPI
- [ ] sparkline은 ECharts mini 또는 D3 path 직접 (8 포인트 충분)
- [ ] 자금난 신호 자동 수집 잡 (공시 RSS · 뉴스 키워드 · 설계사 등록 diff)
- [ ] 매월 1일 자동 신호 갱신 + 변동 행 알림 (Slack/이메일)
- [ ] CSV 내보내기 헤더는 한국어 컬럼명 + UTF-8 BOM
- [ ] 권한별 접근 (CFO/대표 = 실명 / 인수팀 = 라벨)
- [ ] priority 격상 시 행 추가 정렬 + Slack 알림 (인수팀 채널)
