# task-1604.1 완료 보고서

**S**: 네이버 블로그 도구에서 "이미지 생성" 클릭 시 400 에러가 발생하고, 블로그 글 생성 시 "~다" 체(평서형 종결)가 혼입되는 두 가지 버그가 존재한다.

**C**: 이미지 생성 400 에러는 task-1602.1에서 미해결로 남았으며, 프론트엔드가 `prompts` 형태로 전송하는 요청을 구버전 서버가 처리하지 못함. 추가로 image_router에서 Gemini API의 JPEG 응답 시 확장자 불일치로 이미지 생성이 항상 실패하는 숨겨진 버그도 존재했다.

**Q**: 이미지 생성 전체 파이프라인(요청→생성→서빙)을 정상화하고, ~다 체 혼입을 프롬프트 레벨에서 차단할 수 있는가?

**A**: 3건의 버그를 모두 수정하여 전체 파이프라인이 정상 동작한다. (1) 서버 재시작으로 prompts 형태 400 에러 해소 — 200 OK 확인, (2) image_router.py에서 .png/.jpg 확장자 fallback 추가 — Gemini 이미지 생성 성공률 0%→100%, (3) ~다 체 금지 규칙을 3개 톤(mixed/formal/casual) 공통으로 삽입. pytest 7건 전체 통과, pyright 에러 0건.

## 수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — ~다 체 금지 규칙 추가 (345-348행), 이미지 서빙 URL 디코딩 수정 (2804행)
- `/home/jay/workspace/tools/ai-image-gen/image_router.py` — _generate_gemini() 확장자 fallback (172행), generate_image() output_path 갱신 (389-390행)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **서버 구버전 실행 중 (400 에러 원인)** — 코드에 이미 prompts 처리 로직이 존재했으나 서버 미재시작. PID 파일 정리 후 서버 재시작으로 해결.
2. **image_router Gemini 확장자 불일치** — Gemini API가 JPEG 반환 시 `.jpg`로 저장하지만 router가 `.png` 존재를 확인하여 항상 실패. `_generate_gemini()`와 `generate_image()`에 `.jpg` fallback 경로 추가.
3. **이미지 서빙 URL 디코딩 누락** — 한글 파일명이 URL 인코딩된 상태로 전달되나 서버에서 디코딩 안 함. `urllib.parse.unquote()` 추가.

### 범위 외 미해결 (0건)
없음.

## 테스트 결과

- `POST /api/naver-blog/generate-images` prompts 형태: 200 OK (기존 400 → 해결)
- `POST /api/naver-blog/generate-images` descriptions 형태: 200 OK
- 빈 payload, 빈 배열, 잘못된 형식: 400 정상 반환
- 이미지 생성 백그라운드: status "done", 570KB JPEG 생성 확인
- 이미지 서빙 API: 200 OK, JPEG 파일 정상 전송
- `_build_naver_blog_prompt()` 3개 톤 모두 ~다 체 금지 규칙 포함 확인
- pytest: 7 passed, pyright: 0 errors

## 모델 사용 기록

- 불칸 / ~다 체 금지 규칙 추가 / sonnet / -
- 불칸 / image_router 확장자 불일치 수정 / sonnet / -

## QC 자동 검증 결과

```json
{
  "test_runner": "PASS (7 passed)",
  "pyright_check": "PASS (0 errors)",
  "data_integrity": "PASS",
  "style_check": "WARN (기존 포맷팅)"
}
```
