# 이미지 생성 점진적 저장 + 이어서/재실행 구현 플랜

> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** 이미지 생성 중단 시 완료분 유지, 이어서 생성/전체 재실행 모드 지원

**Architecture:** 건당 즉시 DB 커밋 + mode 파라미터(resume/full) + 생성 상태 조회 API + 프론트 조건부 버튼

**Tech Stack:** FastAPI, SQLAlchemy, React/TypeScript

---

## Chunk 1: 백엔드 — 건당 커밋 + mode 파라미터

### Task 1: API — mode 파라미터 + 생성 상태 조회

**Files:**
- Modify: `backend/app/api/v1/images.py`

- [ ] **Step 1: generate-reference-images에 mode 파라미터 추가**
  - `?mode=resume` (기본) / `?mode=full`
  - mode를 백그라운드 스레드에 전달

- [ ] **Step 2: generate-images에 mode 파라미터 추가**
  - 동일하게 mode 전달

- [ ] **Step 3: 생성 상태 조회 엔드포인트 추가**
  - `GET /episodes/{episode_id}/generation-status`
  - 응답: `{ ref_total, ref_done, scene_total, scene_done }`

- [ ] **Step 4: 커밋**

### Task 2: image_service — generate_reference_images_only 건당 커밋 + resume

**Files:**
- Modify: `backend/app/services/image_service.py` (generate_reference_images_only 메서드)

- [ ] **Step 1: mode 파라미터 추가**
  - `mode="resume"` 기본값

- [ ] **Step 2: resume 모드 — 이미 primary 참조 이미지 있는 엔티티 스킵**
  - 기존 ImageAsset 조회 → 있으면 ref_image_map에 로드하고 스킵

- [ ] **Step 3: full 모드 — 기존 참조 이미지 삭제 후 전체 생성**
  - `mode == "full"` 이면 해당 에피소드의 reference asset 전부 DELETE

- [ ] **Step 4: ThreadPoolExecutor as_completed 루프에서 건당 즉시 DB 저장 + commit**
  - 기존: ref_results 리스트에 모으고 루프 끝에 일괄 저장
  - 변경: as_completed 콜백에서 바로 ImageAsset 생성 + self._db.commit()

- [ ] **Step 5: progress.update를 건당 호출**
  - 기존: 배치 단위
  - 변경: 개별 엔티티 완료마다

- [ ] **Step 6: 커밋**

### Task 3: image_service — generate_images 건당 커밋 + resume

**Files:**
- Modify: `backend/app/services/image_service.py` (generate_images 메서드)

- [ ] **Step 1: mode 파라미터 추가**

- [ ] **Step 2: resume 모드 — DB에 이미 씬 이미지 있는 still_id 스킵**
  - 기존 scene asset 조회 → 있으면 스킵 + location_scene_history에 로드

- [ ] **Step 3: full 모드 — 기존 씬 이미지 삭제 후 전체 생성**

- [ ] **Step 4: as_completed에서 건당 즉시 저장 + commit**
  - 씬 이미지 + 변형(A/B) 포함

- [ ] **Step 5: progress를 개별 씬 완료마다 업데이트**

- [ ] **Step 6: 커밋**

## Chunk 2: 프론트엔드 — 조건부 버튼

### Task 4: 생성 상태 조회 + 버튼 분기

**Files:**
- Modify: `frontend/src/pages/EpisodeDetail.tsx`
- Modify: `frontend/src/pages/Entities.tsx`

- [ ] **Step 1: EpisodeDetail — generation-status API 호출**
  - 에피소드 로드 시 상태 조회

- [ ] **Step 2: EpisodeDetail — 씬 이미지 버튼 조건 분기**
  - 미완료 (scene_done < scene_total): "이어서 생성" + "전체 재실행" 2개
  - 완료 또는 0: "전체 생성" 1개
  - 각 버튼에 mode 파라미터 전달

- [ ] **Step 3: Entities — 요소 이미지 버튼 조건 분기**
  - 미완료 (ref_done < ref_total): "이어서 생성" + "전체 재실행" 2개
  - 완료 또는 0: "전체 생성" 1개

- [ ] **Step 4: i18n 키 추가**

- [ ] **Step 5: 커밋**
