---
task_id: task-2222
type: context
scope: task
created: 2026-04-27
updated: 2026-04-27
status: in-progress
---

# 맥락 노트: task-2222

**task**: task-2222

---

## 결정 근거

### claude CLI subprocess 선택
- Edge Function + 외부 API 키 의존 → 완전 불능 상태
- Max200 플랜 내 claude CLI 사용 시 추가 API 비용 없음
- 대안 A(API 키 직접 사용): 추가 비용 발생 → 기각
- 대안 B(Edge Function 복구): Supabase 의존도 높아 재발 가능 → 기각
- 대안 C(CLI subprocess): 서버 자체 완결, 외부 의존성 최소 → **채택**

### 프리셋 + 커스텀 하이브리드 UX
- 초보자: 프리셋 4종으로 원클릭 사용
- 고급 사용자: 개별 스킬 6종 커스텀 선택
- 플랜별 스킬 잠금으로 업그레이드 유도

### 큐 시스템 (asyncio.Semaphore)
- 동시 요청 제어: MAX_CONCURRENT = 10
- 간단한 인메모리 큐 (Redis 불필요)
- 대기열 상태 API 제공

## 3 Step Why

1st Why: "왜 이 설계가 필요한가?"
→ Edge Function + API 키 의존 구조 불능. CLI subprocess로 Max200 플랜 내 처리하면 비용 0원으로 복구.

2nd Why: "왜 CLI subprocess가 최선인가?"
→ ANTHROPIC_API_KEY 불필요, 서버에서 기존 인증/플랜 검증 로직 재활용. 서버 자체 완결.

3rd Why: "왜 다른 대안보다 나은가?"
→ API 키 직접 사용은 추가 비용, Edge Function 복구는 외부 의존도 높아 재발 위험. CLI는 의존성 최소.

A→B→C 일관성: 확인됨.

## 참조 자료

- task 파일: `/home/jay/workspace/memory/tasks/task-2222.md`
- task-2220 기존 코드: `/home/jay/projects/InsuRo/server/main.py` (L747~L1100)
- 스킬 참조: `~/.claude/skills/` 하위 blog-writer, naver-seo 등

## 주의사항

- SSE 스트리밍에서 job_id + polling 방식으로 전환 (프론트 변경 필수)
- 기존 GenerateContentRequest 모델에 skills 필드 추가 필요
- claude CLI가 서버에 설치되어 있어야 함 (Max200 플랜 전제)
- 프론트에서 API 호출 URL은 동일하게 유지 (/api/insuro/generate-content)
