# task-2099 완료 보고서: InsuRo AI 콘텐츠 생성 실패 수정

## SCQA

**S**: InsuRo의 AI 마케팅 → AI 콘텐츠 작성 기능은 Supabase Edge Function(`generate-content`)을 통해 Gemini/Claude API를 호출하여 콘텐츠를 생성한다.

**C**: "콘텐츠 생성하기" 버튼 클릭 시 "생성 실패 (failed to fetch)" 에러가 발생. 원인은 Generate.tsx에서 직접 fetch() 호출 시 Authorization 헤더에 Supabase anon key를 세션 토큰 대신 사용하고, apikey 헤더가 누락되어 Edge Function이 요청을 거부하는 것.

**Q**: 프론트엔드 인증 방식 수정만으로 콘텐츠 생성 기능을 복구할 수 있는가?

**A**: Generate.tsx 단일 파일 수정으로 해결. (1) supabase.auth.getSession()으로 사용자 access_token 획득, (2) Authorization 헤더를 세션 토큰으로 교체, (3) apikey 헤더 추가. 추가로 403 에러 코드 분기를 3종(upgrade_required, channel_not_allowed, 기타)으로 개선. `npm run build` 성공, `tsc --noEmit` 에러 0건.

## 수정 파일

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| src/pages/Generate.tsx:141-146 | supabase.auth.getSession()으로 access_token 획득 + 미인증 시 조기 반환 | grep "session.access_token" OK (1건) | verified |
| src/pages/Generate.tsx:154 | Authorization 헤더를 session.access_token으로 변경 | grep "session.access_token" OK | verified |
| src/pages/Generate.tsx:155 | apikey 헤더 추가 | grep "apikey:" OK (1건) | verified |
| src/pages/Generate.tsx:172-179 | 403 에러 코드 분기 (upgrade_required, channel_not_allowed) | grep "upgrade_required" OK (1건) | verified |

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **anon key를 Authorization으로 사용** — session.access_token으로 교체
   - 상세: Generate.tsx:147 → `import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY` 대신 `session.access_token` 사용
2. **apikey 헤더 누락** — fetch 헤더에 `apikey: import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY` 추가
   - 상세: Generate.tsx:155 신규 추가
3. **403 에러 원인 불투명** — errData.error 코드 기반 3분기 처리로 사용자에게 정확한 에러 메시지 제공
   - 상세: Generate.tsx:172-179 변경

### 범위 외 미해결 (1건)
1. **contentType이 label로 전송됨** — 범위 외 사유: channel.label(예: "네이버 블로그")이 Edge Function의 allowed_channels(예: "blog")와 매핑 불일치 가능. 별도 이슈로 추적 필요.

## 검증 결과

- `tsc --noEmit`: 에러 0건
- `npm run build`: 성공 (7.94초)
- 개발 서버: 포트 5173 정상 구동
- 로그인 리다이렉트: 정상 작동 (미인증 시 /login)

## L1 스모크테스트 결과

- 서버 재시작: 해당없음 (프론트엔드 변경만)
- API 응답 확인: 해당없음 (Supabase Edge Function은 원격 배포 환경에서만 테스트 가능)
- 스크린샷: task-2099-login-page.png (로그인 페이지 정상 렌더링 확인)
- 빌드 성공: npm run build 통과 (Generate-C4MCc8OI.js 80.71 kB)
- 참고: Supabase Edge Function 호출은 실제 인증 세션이 필요하므로, 배포 후 수동 검증이 필요합니다.

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-2099-dev1
- **워크트리 경로**: /home/jay/projects/InsuRo/.worktrees/task-2099-dev1
- **머지 의견**: 단일 파일(Generate.tsx) 17줄 추가/2줄 삭제. 인증 방식의 명확한 버그 수정으로 충돌 가능성 매우 낮음. 빌드/타입 체크 모두 통과.

## QC 예외 사유

- **tdd_check FAIL**: 프론트엔드 fetch 헤더 수정(인증 토큰 교체)에 대한 단위 테스트가 없음. 이 수정은 Supabase SDK 인증 흐름의 헤더 값 교체로, 단위 테스트가 아닌 통합 테스트(실제 Supabase 인증 세션) 영역임. 로컬 환경에서는 빌드/타입 체크로 대체 검증.
- **git_evidence FAIL**: 커밋은 InsuRo 프로젝트의 worktree 브랜치(task/task-2099-dev1)에 존재. workspace repo와 별개의 git repo이므로 qc_verify.py의 workspace 기준 git log에서 미감지.

## 모델 사용 기록

- 팀원: 이리스 / 작업 내용: Generate.tsx 인증 방식 수정 + 403 에러 분기 / 사용 모델: sonnet / 정당성: -


## 세션 통계
- 총 도구 호출: 0회

