# task-3023 — /generate 화면에 카페 채널 + AI 모델 4종 붙이기

**레벨**: Lv.2 · **팀**: dev5-team · **회장 승인 완료** (2026-08-26)
**저장소**: `Jeon-Jonghyuk/InsuRo` (`/home/jay/projects/InsuRo`, 기본 브랜치 **main**)

## ★ 이 태스크는 신규 개발이 아니다 — 서버는 이미 완성·배포됐다
**서버가 다 돼 있는데 화면이 그걸 안 쓴다.** 그래서 회장 지시 기능이 실효 0 이다.
**화면을 서버에 맞추는 것**이 전부다. 서버 로직을 바꾸지 마라.

### 서버 현황 (main `14e9596`, 프로덕션 배포 완료 — 읽기만 하라)
```python
# server/main.py
GENERATION_MODELS = {
  "haiku":  {"engine":"claude", "cli_model":"haiku",  "min_cap":"haiku",   "label":"Claude Haiku"},
  "sonnet": {"engine":"claude", "cli_model":"sonnet", "min_cap":"sonnet",  "label":"Claude Sonnet"},
  "opus":   {"engine":"claude", "cli_model":"opus",   "min_cap":"premium", "label":"Claude Opus"},
  "gpt":    {"engine":"codex",  "cli_model":None,     "min_cap":"premium", "label":"GPT (codex)"},
}
PLAN_LEVEL_MODEL_CAP = {0:"haiku", 1:"haiku", 2:"sonnet", 3:"sonnet", 4:"premium", 5:"premium"}
MODEL_CAP_RANK = {"haiku":0, "sonnet":1, "premium":2}
PLAN_CHANNEL_ALLOWLIST  # naver-cafe 는 0~5 전 플랜 개방 (무료 포함) — 회장 결정
```
플랜: 0=Fallback 1=무료 2=베이직 3=프로 4=맥스 5=히든

### 프론트 현황 (`src/data/generateOptions.ts`) — 서버와 어긋나 있다
```
채널  naver-blog · tistory-blog · instagram · threads · youtube-reels · text · image · video
      → naver-cafe 없음. 서버는 열려 있는데 사용자가 고를 수 없다
모델  google/gemini-2.5-flash · google/gemini-2.5-pro · anthropic/claude-sonnet
      → opus 없음 · gpt 없음 · 회장이 지시하지 않은 Gemini 가 노출됨
```


## ★★ 이것은 재개다 (2026-08-26 14:30 KST)
이전 세션은 **서버 OOM 으로 사망**했다(10:34 global oom-kill → cokacdir 서비스 전체 사망).
네 실수가 아니다.

### 반드시 지킬 것 — 오늘 실제로 사고가 났다
1. **worktree 를 써라.** 메인 저장소 `/home/jay/projects/InsuRo` 를 체크아웃 점유하지 마라.
   그 경로는 **cron 이 매일 06:00·08:00 에 직접 실행**한다. 오늘 다른 팀이 점유해 ANU 가 수동 복구했다.
2. **단계마다 커밋하라.** 오늘 죽은 4팀 중 2팀은 커밋 0이라 진척이 전부 사라졌다.
3. **메모리를 아껴라.** 서버 RAM 15GB, 봇 여러 팀이 동시 가동 중이다.
   유튜브 파이프라인이 **18:16 KST 에 실행**된다. 그 시간대 대용량 작업을 피하라.

### 현재 상태
브랜치 `task-3023-generate-cafe-models` 에 **실작업이 이미 있다**(`generateOptions.ts` +110/-17: naver-cafe 채널 프롬프트 전문 + 모델 4종 + ModelTier 를 서버 정본 premium 에 정렬).
커밋 `e7c2dc6`, DRAFT PR **#258**. ANU 가 재부팅 시점에 보존한 것이며 **검증 전**이다.
→ 처음부터 다시 하지 말고 **그 작업물을 검증·완성**하라. 라이브 실측은 아직 naver-cafe 0건·Opus 0건이다.

## 고칠 것

### ① 네이버 카페 채널 추가
`channels` 배열에 `naver-cafe` 를 추가한다. **전 플랜(무료 포함) 선택 가능**하다.
- 카페 글쓰기 프롬프트는 블로그와 달라야 한다. 카페는 검색 SEO 보다 **커뮤니티 톤·질문형·경험담**이 통한다.
  기존 `naver-blog` 프롬프트를 그대로 복사하지 마라
- 서버가 받는 값과 **정확히 일치**해야 한다(`naver-cafe`). 오타 하나로 전 플랜이 막힌다

### ② 모델 선택 4종으로 교체
서버 `GENERATION_MODELS` 의 4개 canonical key 와 **1:1로 맞춘다**: `haiku` · `sonnet` · `opus` · `gpt`
- 라벨은 서버 `label` 을 따른다(Claude Haiku / Claude Sonnet / Claude Opus / GPT)
- **Gemini 항목은 제거한다.** 서버 레지스트리에 없는 모델이라 보내봐야 폴백된다
- ★ 프론트 `ModelTier` 는 `haiku|sonnet|opus` 인데 **서버 cap 은 `haiku|sonnet|premium`** 이다.
  이름이 다르다. 어느 쪽에 맞출지 정하고 **그 근거를 보고서에 적어라.** 서버가 정본이다

### ③ 플랜별 상한을 화면에 반영
```
무료(1)         haiku 만
베이직(2)·프로(3) haiku · sonnet
맥스(4)·히든(5)  haiku · sonnet · opus · gpt
```
- 상한 초과 모델은 **선택 자체를 막거나 잠금 표시**한다. 골라놓고 서버에서 강등되면 사용자가 속는다
- 잠긴 모델에는 **업그레이드 유도**를 붙인다(기존 플랜 업셀 패턴을 따를 것)

## ★ 하지 말 것
- **서버 로직 변경 금지** — `server/main.py` 의 모델/채널 상수와 강제 로직은 t3014 결과물이다. 읽기만 하라
- 다른 채널의 플랜 정책 변경 금지 (카페만 전 플랜이다)
- `/generate` 외 화면 변경 금지

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "src/data/generateOptions.ts"
    - "src/data/__tests__/**"
    - "src/components/GenerateSettingsPanel.tsx"
    - "src/hooks/usePlanFeatures.ts"
    - "src/pages/Generate.tsx"
    - "src/**/__tests__/**"
    - "memory/reports/task-3023.md"
  forbidden_paths:
    - "server/**"
    - "extension/**"
    - "src/pages/PolicyAnalysis.tsx"
    - "src/pages/NewDesignComparison.tsx"
    - ".github/workflows/**"
  commands: ["npm", "npx", "node", "bash", "python3", "gh"]
  merge_policy: "tiered"
  ttl_hours: 24
```

## 검증 (실측 강제)
1. **서버 계약 일치 증명** — 프론트가 보내는 채널/모델 문자열이 서버 상수와 **완전 일치**함을
   양쪽 소스를 나란히 놓고 대조표로 제시하라. 추정 금지
2. **플랜별 가시성 6종** — 플랜 0~5 각각에서 어떤 모델이 보이고 잠기는지 전수 표로
3. **실호출 1건 이상** — 카페 채널 + 무료 플랜으로 실제 생성 요청을 보내 **200 과 결과물**을 확인하라.
   "빌드 통과"는 검증이 아니다
4. **회귀** — `vitest` **base 를 직접 재측정**해 기준선으로 삼아라(명세 숫자 믿지 말 것)
5. **봉인** — 모델 상한을 무력화하는 변이(예: 무료에 opus 노출)를 만들어 테스트가 FAIL 하는지
   확인하고 복원하라. 변이가 no-op 이 아님을 `assert` 로 먼저 증명하라
6. **실 브라우저** — `npm run build` 후 화면에서 카페 선택 + 모델 목록을 **스크린샷**으로 남겨라

## 완료 조건 (DoD)
**화면에서 네이버 카페를 고를 수 있고, 모델 4종이 서버 레지스트리와 일치하며,
플랜 상한을 넘는 모델은 선택 자체가 막히고, 카페 실호출이 성공한다.**

## ★ 세션 조기 종료 대책
시작 즉시 브랜치 + 드래프트 PR 을 먼저 열어라. 단계마다 PR 본문에 진행을 갱신하라.
★ ANU 명세 전제가 틀렸다고 판단되면 구현하지 말고 **반증을 먼저 기록한 뒤 보고하라.**

## 운영 계약
- `origin/main`(=`14e9596`) 기준 `git pull --ff-only` 후 시작
- ★ `gh` 호출 시 `GH_TOKEN="$BOT_GITHUB_TOKEN"` 주입 필수 (회장 개인 PAT 금지 — 감사기록 오염)
- 워크플로우 `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md` · QC `/home/jay/workspace/teams/shared/QC-RULES.md`
- `WORKSPACE_ROOT=/home/jay/workspace` · `CHAT_ID=6937032012` · 수집자 key `ANU_KEY=c119085addb0f8b7`
- 완료 경로는 `finish-task.sh` 실행이 유일하다. 수동 `.done` 금지.

## 보고
**PR 생성까지가 범위다. 머지는 ANU 가 한다. 자동 머지 금지.**
`memory/reports/task-3023.md` 작성 후 표준 완료 콜백 등록. 콜백 프롬프트 **UTF-8 3900 bytes 이하**.
★ 봉투 첫 줄에 **"카페 실호출 성공 여부 + 서버 계약 일치 여부"** 를 담아라.

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