# task-2132: InsuRo 플랜 계층 구조 수정 + 채널 값 매핑 정상화

## ★ 프로젝트: `/home/jay/projects/InsuRo/`

## 문제 1: 플랜 계층 구조 미반영
Hidden 플랜(최상위)에서 "현재 플랜에서 지원하지 않는 채널입니다" 에러 발생.
윗단계 플랜은 아랫단계 플랜의 모든 기능을 사용 가능해야 함.

### 플랜 계층 (낮은 → 높은)
```
Free < Basic < Pro < Max < Hidden
```

### 현재 동작
- Hidden 플랜에서 네이버 블로그 채널 + Claude Sonnet 모델 선택 → 403 "channel_not_allowed"
- 원인: DB `plan_features` 테이블의 `allowed_channels`가 상위 플랜에서도 제한적

### 수정 방향
- **상위 플랜은 하위 플랜의 모든 권한을 자동 상속**
- Hidden/Max: 모든 채널 + 모든 모델 사용 가능
- Edge Function에서 플랜 계층 체크 시 상속 로직 적용

## 문제 2: 채널 값 형식 불일치
프론트엔드가 보내는 채널 값과 DB/Edge Function의 기대값이 불일치.

### 현재 흐름
1. 프론트엔드 `Generate.tsx:107`: `settings.channel = channel.label` → **"네이버 블로그"** (한글)
2. 프론트엔드 `Generate.tsx:160`: `contentType = channel.label` → **"네이버 블로그"**
3. Edge Function `index.ts:365`: `requestedChannel = settings?.channel || contentType || "blog"`
4. DB `plan_features.allowed_channels`: 아마 **["blog"]** 또는 **["naver-blog"]**
5. **"네이버 블로그" ∉ ["blog"]** → 403

### 수정 방향
두 가지 중 택1:
- **A (권장)**: 프론트엔드가 `channel.value` ("naver-blog")를 settings에 넣도록 수정
- **B**: Edge Function에서 한글 label → value 매핑 테이블 추가

## ★ 먼저 읽을 파일
- `/home/jay/projects/InsuRo/supabase/functions/generate-content/index.ts` — L355~400 (플랜 체크 로직)
- `/home/jay/projects/InsuRo/src/pages/Generate.tsx` — L107, L158~166 (settings/channel 전송)
- `/home/jay/projects/InsuRo/src/data/generateOptions.ts` — L6~160 (채널 정의)
- Supabase DB: `plan_features` 테이블 — allowed_channels, allowed_models 컬럼 확인

### DB 확인 명령
```bash
# plan_features 테이블 조회 (supabase REST API)
curl -s "https://zayhfjuwviporbzokudr.supabase.co/rest/v1/plan_features?select=*" \
  -H "apikey: <anon_key>" \
  -H "Authorization: Bearer <service_role_key>" | python3 -m json.tool
```

## 검증 시나리오 (이게 되면 성공)

### 시나리오 1: Hidden 플랜 콘텐츠 생성
1. Hidden 플랜 계정으로 로그인
2. AI 콘텐츠 작성 → 네이버 블로그 → Claude Sonnet → "30대 암보험 비교" → 생성
3. 콘텐츠 정상 반환 (403 에러 없음)

### 시나리오 2: Hidden 플랜 모든 채널 사용
- 네이버 블로그 ✅
- 티스토리 ✅
- 인스타그램 ✅
- 스레드 ✅
- 유튜브/릴스 ✅

### 시나리오 3: Hidden 플랜 모든 모델 사용
- Gemini 2.5 Flash ✅
- Gemini 2.5 Pro ✅
- Claude Sonnet ✅

### 시나리오 4: Free 플랜 제한 유지
- Free → 네이버 블로그만 ✅
- Free → Gemini Flash만 ✅
- Free → 월 5건 ✅

## 완료 시그니처
- Hidden 플랜에서 모든 채널 + 모든 모델 사용 가능
- 플랜 계층 상속 로직 적용 (상위 ⊇ 하위)
- 채널 값 매핑 정상화 (프론트↔백엔드 일치)
- Free/Basic 플랜 기존 제한 유지 (회귀 없음)
- Edge Function 재배포 (supabase functions deploy generate-content --project-ref zayhfjuwviporbzokudr)
  - SUPABASE_ACCESS_TOKEN은 .env.keys에서 로드

## 레벨
- critical

## 프로젝트
- insuro
