시나리오 텍스트 한 편이 들어와 씬별 최종 이미지가 나오기까지 파이프라인은 84개 스텝(활성 73 · 폐기 10)으로 구성된다. 각 스텝은 체크포인트를 남기고, 다음 스텝은 그 체크포인트만 읽는다 — 그래서 중간부터 재개할 수 있고, 어디서 잘못됐는지 되짚을 수 있다.
구간 흐름
flowchart TD A["1 텍스트 준비
0 ~ 7"] --> B["2 Beat → Shot
7.1 ~ 7.25 · 15.5"] B --> C["3 엔티티 추출
6.5 · 8 ~ 15"] C --> D["4 연출 · 스테이징
16 ~ 19.9"] D --> E["5 배경 계획 · 도면
19.51 ~ 21.66"] E --> F["6 샷 상세 · T2I
21.7 ~ 21.73"] F --> G["7 야외 구조물 계보
21.76 ~ 21.92"] F --> H["8 이미지 생성
22 ~ 25"] G --> H style A fill:#eef4ff,stroke:#3f6fd8 style B fill:#eef4ff,stroke:#3f6fd8 style C fill:#eef4ff,stroke:#3f6fd8 style D fill:#fff3d6,stroke:#c8922a style E fill:#fff3d6,stroke:#c8922a style F fill:#fff3d6,stroke:#c8922a style G fill:#efe3ff,stroke:#7b4fbd style H fill:#e8f5e9,stroke:#2e7d32
모델 분업 — 왜 이렇게 나뉘어 있나
모델은 취향이 아니라 실측 비교로 배정됐다(2026-07-11 4회차 전수 + 교차 검증).
| 계열 | 모델 | 담당 | 배정 근거 |
|---|---|---|---|
| 확정 · 감독 | gemini-pro |
beat/shot 추출, shot_validator, scene_director, scene_detail, scene_consistency, 배경·소품 추출, entity_t2i, 아웃룩 3단계 | 감독·배정·실사용 연속성에서 우세. Sol 은 beat/shot 을 +160% 과세분했다. |
| 분석 주력 | gpt (Sol) |
분석 37스텝 + 인물 추출 3스텝 | 후보 회수율과 구체적 명명에서 우세 — 그래서 인물 추출만 되돌렸다. |
| 보조 | gemini-flash / gpt-mini |
세그먼테이션, 요약, 필터, shot 선택, 번역 | 정확도 요구가 낮고 양이 많은 자리. |
| 이미지 | gemini-image / gpt-image-2 /
grok-imagine-image-2.0 |
참조·합성·배경·콘티·씨드·최종 스틸 생성과 선택적 시네마틱 변환 | 최종 스틸은 nb2 기본, grok2 선택형이며 시네마틱
변환은 생성 엔진과 독립된 Grok i2i 단계다. |
| 판정(VLM) | GPT + Gemini 합산 | 이미지 검증, 비교 선택, 앵글 추천, 실내/실외 판정 | 한쪽 심판이 평균을 지배하는 문제가 실측돼 이중 판정으로 갔다. |
이 문서를 읽는 법
- 탭 하나가 파이프라인의 한 구간이다. 각 탭은 흐름도 + 스텝 카드로 되어 있고, 카드의 사실(모델·선행·팩·파일·줄수)은 전부 코드에서 뽑았다.
- 흐름도에서 초록 = Gemini, 파랑 = 자산 생성, 회색 점선 = 폐기, 흐린 사각 = 이 구간 밖에서 들어오는 선행 스텝이다.
- 문서와 코드가 어긋나면 코드가 맞다. 이 문서는 매니페스트·클래스· 팩 디렉토리를 그대로 읽어 생성한다.
[:400] 류 절단 금지. 씬 분할(scene_split)은
v4 에서 제거됐고 원본 씬이 그대로 보존된다.scene_segmentation 은 LLM 이 정규식 파서를 정의하고 코드가
그것을 실행하는 형태다 — 글자 패턴으로 의미를 판단하지 않는다는 규칙과,
세그먼테이션이라는 기계적 작업을 구분한 결과다.
visual_world_rules 는 이 작품의 물리적 존재 판단 기준을 만들어
director_notes 로 beat·shot·감독 단계에 전달된다.
구간 흐름 — 스텝 순서와 의존
flowchart TD Nplanning_doc_analysis["0 기획서 분석\nplanning_doc_analysis"] Ntext_cleanup["1 텍스트 정리\ntext_cleanup"] Nscene_segmentation["2 씬 세그먼테이션\nscene_segmentation"] Nepisode_summary["3 에피소드 요약\nepisode_summary"] Nvisual_world_rules["4 시각적 세계관 규칙\nvisual_world_rules"] Nscene_save["6 씬 저장\nscene_save"] Nscene_summary["7 씬별 요약 병렬 \nscene_summary"] Ntext_cleanup --> Nscene_segmentation Nepisode_summary --> Nvisual_world_rules Nscene_segmentation --> Nscene_save Nscene_save --> Nscene_summary Nepisode_summary --> Nscene_summary Nvisual_world_rules --> Nscene_summary style Nplanning_doc_analysis fill:#e8f5e9,stroke:#2e7d32 style Ntext_cleanup fill:#e8f5e9,stroke:#2e7d32 style Nscene_segmentation fill:#e8f5e9,stroke:#2e7d32 style Nepisode_summary fill:#e8f5e9,stroke:#2e7d32 style Nscene_summary fill:#e8f5e9,stroke:#2e7d32
스텝 7개 — 상세
planning_doc_analysis
gemini-lite
기획서를 LLM으로 분석 — PDF multimodal 우선, 텍스트 fallback.
구현 주석 전문
기획서 업로드 시점에 ``planning_doc_analysis_service`` 가 project-level
checkpoint 를 미리 만들어둠. 본 step 은 episode 분석 cascade 호환을 위해
유지되지만, project-level 결과가 있으면 그대로 mirror 하고 LLM 재호출은
하지 않음.backend/app/core/steps/planning_doc_step.py
116줄text_cleanup
gemini-lite
Step 1: PDF → Gemini Flash Lite로 텍스트 추출.
backend/app/core/steps/text_steps.py
44줄text_cleanup v1.202603231200cleaned_length cleaned_text original_length gemini-litescene_segmentation
gemini-flash
Step 1: 씬 세그먼테이션 — LLM 은 그 대본용 규칙을 쓰고, 코드가 경계를 찍는다.
구현 주석 전문
설계 = docs/superpowers/specs/2026-08-08-scene-segmentation-rule-authoring-design.md
## 무엇이 달라졌나 (2026-08-08)
전에도 LLM 이 정규식을 만들었지만 **후보를 하나만 받고 검증이 평균 길이
하나**였다. 그래서 "개수는 맞는데 경계가 틀린" 규칙이 그대로 통과했다 —
22개 대본 실측에서 그런 결함을 넷 찾았고, 넷 다 숫자만 봐서는 안 드러났다.
지금은 후보를 2~3개 받아 기계 계약(C1~C7)으로 재고, 통과한 후보끼리 **경계가
갈린 자리를 양쪽 다** 되돌려주고 다시 쓰게 한다. 한쪽만 보면 정답을 통째로
포함하는 넓은 규칙이 조용히 이긴다(재현함).
★상한을 다 쓰고도 차이가 남으면 성공으로 두지 않는다. 코드가 이미 아는
차이를 남긴 채 확정하면 대본 전체가 밀린 채 하류로 내려간다.backend/app/core/steps/scene_steps.py
94줄text_cleanuptext_cleanup v1.202603231200·1판·1절 모듈 수준 추정segments total_scenes gemini-flashepisode_summary
gpt-mini
Step 3: 에피소드 요약 (500자).
backend/app/core/steps/summary_steps.py
29줄episode_summary v1.202603231200·1판·1절 scene_summary v1.202603231200·1판·1절 text_cleanup v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절 모듈 수준 추정key_events summary gpt-minivisual_world_rules
gpt
Step 4: 시각적 세계관 규칙 추출.
구현 주석 전문
입력:
- text_cleanup 체크포인트 (정리된 텍스트)
- episode_summary 체크포인트 (에피소드 요약)
출력:
- rules: 시각적 규칙 목록
- era: 시대 배경
- region: 지역/국가 배경backend/app/core/steps/summary_steps.py
57줄episode_summaryepisode_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절director_notes era region rules source_language t2i_context gptscene_save
-
Step 6: 씬 저장 (DB + checkpoint). LLM 호출 없음.
구현 주석 전문
scene_segmentation 결과(오프셋)를 받아 fulltext를 슬라이스하여
각 segment에 text 필드를 추가한다.
이후 downstream 스텝은 seg["text"]만 사용하고 fulltext 로딩 불필요.backend/app/core/steps/scene_steps.py
37줄scene_segmentationtext_cleanup v1.202603231200·1판·1절 모듈 수준 추정segments total_scenes -scene_summary
gpt-mini
Step 7: 씬별 요약 (병렬 ThreadPool).
구현 주석 전문
입력:
- scene_save 체크포인트 (segments)
- text_cleanup 체크포인트 (정리된 텍스트)
- episode_summary 체크포인트 (에피소드 요약)
- visual_world_rules 체크포인트 (시각적 규칙)
출력:
- scene_summaries: [{scene_index, scene_summary}, ...]backend/app/core/steps/summary_steps.py
68줄scene_save episode_summary visual_world_rulesepisode_summary v1.202603231200·1판·1절 scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절summaries gpt-miniscene_still 한 행이 곧 1 shot 이고
scene_index 로 씬에 묶인다.
shot_selection 은 씬당 최대 3개를 고르고, 그 뒤 단계는 선택된
shot 에만 붙는다. 각 shot 은 촬영 기법 2종을 받아 T2I variation 2개가 된다.
구간 흐름 — 스텝 순서와 의존
flowchart TD EXT[/"앞 구간 산출 3종"/] Nbeat_extract["7.1 Beat 추출 병렬 \nbeat_extract"] Nshot_extract["7.2 Shot 추출 순차 \nshot_extract"] Nshot_validator["7.25 Shot 검증\nshot_validator"] Nshot_selection["15.5 중요 샷 선택 병렬 \nshot_selection"] Nbeat_extract --> Nshot_extract Nshot_extract --> Nshot_validator Nshot_validator --> Nshot_selection EXT -.-> Nbeat_extract EXT -.-> Nshot_extract style Nbeat_extract fill:#e8f5e9,stroke:#2e7d32 style Nshot_extract fill:#e8f5e9,stroke:#2e7d32 style Nshot_validator fill:#e8f5e9,stroke:#2e7d32 style Nshot_selection fill:#e8f5e9,stroke:#2e7d32 style EXT fill:#fbfbfb,stroke:#bbb
스텝 4개 — 상세
beat_extract
gemini-pro
Beat 추출 — 원본 씬에서 인물 상태 변화 최소 단위 추출.
backend/app/core/steps/beat_shot_steps.py
194줄scene_save visual_world_rules entity_character_listbeat_extract v3.202603301500·3판·2절 visual_world_rules v10.202607080130·10판·1절scenes total_beats gemini-proshot_extract
gemini-pro
Shot 추출 — beat 기반으로 씬별 스틸컷 추출.
backend/app/core/steps/beat_shot_steps.py
298줄beat_extract visual_world_rules entity_character_listbeat_extract v3.202603301500·3판·2절 shot_extract v17.202607222348·9판·2절 visual_world_rules v10.202607080130·10판·1절scenes total_shots gemini-proshot_validator
gemini-pro
각 shot description을 '한 찰나' 원칙에 맞게 검증·재작성.
backend/app/core/steps/shot_validator_step.py
427줄shot_extractscene_director v10.202608070006·5판·1절 shot_extract v17.202607222348·9판·2절 shot_validator v7.202608071300·7판·1절changed_shots scenes total_shots gemini-proshot_selection
gpt-mini
중요 샷 선택 — 씬별 2중 캡 (절대 + 비율).
backend/app/core/steps/shot_selection_step.py
283줄shot_validatorshot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절max_per_scene scenes total_selected total_shots gpt-minientity_merge 가 중복을
병합하고 entity_filter 가 저빈도(3씬 이하) 요소를 LLM 으로 걸러낸다.entity_relation 이 RelationFact 로 의존성을 잇는다. 변신·상태
변화 캐릭터가 한 스틸컷에서 원본과 변형으로 동시에 나오지 않게 하는 근거다.
구간 흐름 — 스텝 순서와 의존
flowchart TD EXT[/"앞 구간 산출 4종"/] Nentity_character_list["6.5 인물 리스트 사전 추출 \nentity_character_list"] Nentity_all_character["8 인물 리스팅\nentity_all_character"] Nentity_extract_character["9 인물 추출\nentity_extract_character"] Nentity_all_location["10 배경 리스팅\nentity_all_location"] Nentity_extract_location["11 배경 추출\nentity_extract_location"] Nentity_all_prop["12 소품 리스팅\nentity_all_prop"] Nentity_extract_prop["13 소품 추출\nentity_extract_prop"] Nentity_merge["13.5 요소 중복 병합\nentity_merge"] Nentity_relation["13.6 요소 변형 관계 추출\nentity_relation"] Nentity_filter["13.7 저빈도 요소 필터링\nentity_filter"] Nentity_detail["14 요소 상세 + enum\nentity_detail"] Nentity_t2i["15 요소 T2I 프롬프트 병렬 \nentity_t2i"] Nentity_all_character --> Nentity_extract_character Nentity_all_location --> Nentity_extract_location Nentity_all_prop --> Nentity_extract_prop Nentity_extract_character --> Nentity_merge Nentity_extract_location --> Nentity_merge Nentity_extract_prop --> Nentity_merge Nentity_merge --> Nentity_relation Nentity_relation --> Nentity_filter Nentity_filter --> Nentity_detail Nentity_detail --> Nentity_t2i EXT -.-> Nentity_character_list EXT -.-> Nentity_all_character EXT -.-> Nentity_all_location EXT -.-> Nentity_all_prop EXT -.-> Nentity_merge style Nentity_extract_location fill:#e8f5e9,stroke:#2e7d32 style Nentity_extract_prop fill:#e8f5e9,stroke:#2e7d32 style Nentity_filter fill:#e8f5e9,stroke:#2e7d32 style Nentity_t2i fill:#e8f5e9,stroke:#2e7d32 style EXT fill:#fbfbfb,stroke:#bbb
스텝 12개 — 상세
entity_character_list
gpt
Step 6.5: 인물 리스트 사전 추출.
구현 주석 전문
씬 텍스트에서 인물 리스트를 1회 호출로 추출.
beat_extract, shot_extract에서 이 리스트를 참조하여 인물명을 제한한다.backend/app/core/steps/character_list_step.py
94줄scene_save visual_world_rulesentity_character_list v2.202605011057·2판·1절 visual_world_rules v10.202607080130·10판·1절characters gptentity_all_character
gpt
인물 리스팅 — shot 기반 1회 호출 (fallback: 씬 체이닝).
backend/app/core/steps/entity_steps.py
30줄scene_save visual_world_rules shot_validatorshot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절characters gptentity_extract_character
gpt
Step 8: 인물 추출 — entity_all_character 리스트 기반으로 상세 설명 추가.
backend/app/core/steps/entity_steps.py
19줄entity_all_charactervisual_world_rules v10.202607080130·10판·1절characters gptentity_all_location
gpt
배경 리스팅 — shot 기반 1회 호출.
backend/app/core/steps/entity_steps.py
23줄scene_save visual_world_rules shot_validatorshot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절locations gptentity_extract_location
gemini-pro
Step 9: 배경 추출 — entity_all_location 리스트 기반으로 상세 설명 추가.
backend/app/core/steps/entity_steps.py
19줄entity_all_locationvisual_world_rules v10.202607080130·10판·1절locations gemini-proentity_all_prop
gpt
소품 리스팅 — shot 기반 1회 호출.
backend/app/core/steps/entity_steps.py
23줄scene_save visual_world_rules shot_validatorshot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절props gptentity_extract_prop
gemini-pro
Step 10: 소품 추출 — entity_all_prop 리스트 기반으로 상세 설명 추가.
backend/app/core/steps/entity_steps.py
19줄entity_all_propvisual_world_rules v10.202607080130·10판·1절props gemini-proentity_merge
gpt
요소 중복 병합 — 타입 간 중복/유사 요소를 LLM으로 판별하여 제거.
backend/app/core/steps/entity_steps.py
103줄entity_extract_character entity_extract_location entity_extract_prop scene_summary visual_world_rulesscene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절characters locations props removed gptentity_relation
gpt
Step 13.6: 요소 변형 관계 추출.
구현 주석 전문
entity_merge 결과에서 같은 대상의 변형 쌍을 식별하고
시각적 유사성 여부를 판단하여 RelationFact에 기록.backend/app/core/steps/entity_relation_step.py
85줄entity_mergebeat_extract v3.202603301500·3판·2절 shot_validator v7.202608071300·7판·1절candidates_checked relations relations_found visual_similar_count gptentity_filter
gpt-mini
Step 11: 저빈도 요소 필터링 (3씬 이하 -> LLM 판단).
backend/app/core/steps/entity_steps.py
68줄entity_relationentity_relation v3.202605181858·3판·2절decisions filtered_entities kept_count removed_count gpt-minientity_detail
gpt
Step 10: 요소 상세 — 시각적 상세 정보 + short_id 확정.
backend/app/core/steps/entity_steps.py
146줄entity_filterentity_extractor_v2 v14.202606181515·11판·8절 entity_filter v3.202605201316·3판·1절 visual_world_rules v10.202607080130·10판·1절entity_details entity_queue gptentity_t2i
gemini-pro
Step 11: T2I 프롬프트 병렬 생성.
backend/app/core/steps/entity_steps.py
299줄entity_detailvisual_world_rules v10.202607080130·10판·1절characters completed locations props gemini-proscene_director 가 확정한 데이터에서 코드가 자동 구축한다.
그리고 하류 T2I 프롬프트가 VE 밖 엔티티를 쓰면 retry 후 강제 제거된다 —
이것이 "씬에 배정된 인물 전체를 한 컷에 다 넣지 않는다"를 강제하는 층이다.C08O09)로
받지 않고 인물·아웃룩을 따로 받아 코드가 조합한다.
shot_staging 이 조명·무드의 SOT 이다(scene_still.lighting_json
아님 — v4 는 그 필드를 저작하지 않는다).
구간 흐름 — 스텝 순서와 의존
flowchart TD EXT[/"앞 구간 산출 8종"/] Nscene_director["16 씬 감독 물리적 존재 \nscene_director"] Nshot_director["16.5 Shot별 VE 판정\nshot_director"] Nscene_camera_flow["17.05 씬 카메라 플로우\nscene_camera_flow"] Nshot_dependency["18.1 Shot 연관 분석 병렬 \nshot_dependency"] Noutlook_phase1["19 아웃룩 목록 추출\noutlook_phase1"] Noutlook_phase2["19.1 아웃룩 씬별 매핑\noutlook_phase2"] Noutlook_phase3["19.2 아웃룩 병합 정리\noutlook_phase3"] Nshot_staging["19.5 촬영 연출 DP \nshot_staging"] Nshot_essence_extraction["19.7 샷 essence 추출\nshot_essence_extraction"] Nscene_consistency["19.9 씬 시각적 일관성\nscene_consistency"] Noutlook_dedup["100 아웃룩 중복 판별\noutlook_dedup"] Nscene_director --> Nshot_director Nscene_director --> Nscene_camera_flow Nscene_director --> Nshot_dependency Nscene_director --> Noutlook_phase1 Noutlook_phase1 --> Noutlook_phase2 Noutlook_phase2 --> Noutlook_phase3 Nscene_camera_flow --> Nshot_staging Nshot_staging --> Nscene_consistency Nshot_director --> Nscene_consistency Noutlook_phase3 --> Noutlook_dedup EXT -.-> Nscene_director EXT -.-> Nshot_director EXT -.-> Nscene_camera_flow EXT -.-> Nshot_dependency EXT -.-> Nshot_staging EXT -.-> Nshot_essence_extraction EXT -.-> Nscene_consistency style Nscene_director fill:#e8f5e9,stroke:#2e7d32 style Noutlook_phase1 fill:#e8f5e9,stroke:#2e7d32 style Noutlook_phase2 fill:#e8f5e9,stroke:#2e7d32 style Noutlook_phase3 fill:#e8f5e9,stroke:#2e7d32 style Nscene_consistency fill:#e8f5e9,stroke:#2e7d32 style EXT fill:#fbfbfb,stroke:#bbb
스텝 11개 — 상세
scene_director
gemini-pro
Step 12: 씬 감독 (V/A/H 3분류).
backend/app/core/steps/director_steps.py
115줄scene_save entity_t2ishot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절scene_present_characters scene_present_entities scenes gemini-proshot_director
gpt
Step 16.5: Shot별 visible entities 판정.
구현 주석 전문
scene_director의 씬 레벨 VE를 shot 단위로 세분화하고,
변형 캐릭터의 전환 시점을 확정한다.backend/app/core/steps/shot_director_step.py
94줄scene_director shot_selection entity_relation shot_validatorentity_filter v3.202605201316·3판·1절 entity_relation v3.202605181858·3판·2절 scene_director v10.202608070006·5판·1절 shot_director v6.202605172247·6판·2절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절llm_called_scenes prompt_version scenes schema_version skipped_scenes total_shots gptscene_camera_flow
gpt
씬 단위 카메라 연속 흐름 설계 — 선택된 샷을 플로우 위에 배정.
backend/app/core/steps/scene_camera_flow_step.py
250줄shot_validator shot_selection scene_director entity_merge scene_savescene_camera_flow v5.202608130110·5판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절scenes gptshot_dependency
gpt
Shot 연관 분석 — 배경 기준 + 엔티티 오버랩 스코어링.
backend/app/core/steps/shot_dependency_step.py
163줄shot_selection scene_directorscene_director v10.202608070006·5판·1절 shot_dependency v1.202603281907·1판·2절 shot_director v6.202605172247·6판·2절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절dependencies gptoutlook_phase1
gemini-pro
아웃룩 Phase1 — 캐릭터별 아웃룩 목록 추출 + orphan retry.
backend/app/core/steps/outlook_steps.py
138줄scene_directorentity_relation v3.202605181858·3판·2절null_outlook_chars outlooks gemini-prooutlook_phase2
gemini-pro
아웃룩 Phase2 — 씬별 캐릭터→아웃룩 매핑 + 누락 retry.
backend/app/core/steps/outlook_steps.py
129줄outlook_phase1entity_relation v3.202605181858·3판·2절 scene_director v10.202608070006·5판·1절 scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절 모듈 수준 추정null_outlook_chars outlooks scene_assignments gemini-prooutlook_phase3
gemini-pro
아웃룩 Phase3 — LLM 병합 판별 + 코드에서 정리.
backend/app/core/steps/outlook_steps.py
82줄outlook_phase2scene_summary v1.202603231200·1판·1절null_outlook_chars outlooks removed scene_assignments gemini-proshot_staging
gpt
샷별 창의적 촬영 연출 + 배경 핵심 요소 분석.
backend/app/core/steps/shot_staging_step.py
60줄shot_validator shot_selection visual_world_rules entity_merge scene_camera_flowscene_camera_flow v5.202608130110·5판·2절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절failed_batches shots total gptshot_essence_extraction
gpt
Shot별 essence/peripheral/atmospheric 3분류 추출.
backend/app/core/steps/shot_essence_extraction_step.py
263줄shot_validator shot_selectionshot_essence_extraction v4.202605201351·4판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절scene_consistency
gemini-pro
씬 내 2+ 샷에 걸친 고정 시각 요소 추출 (scene_detail 직전 실행).
backend/app/core/steps/scene_consistency_step.py
576줄shot_staging shot_director entity_merge shot_validator shot_selection beat_extract scene_save visual_world_rulesbeat_extract v3.202603301500·3판·2절 scene_consistency v8.202605191744·7판·1절 shot_director v6.202605172247·6판·2절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절scenes gemini-prooutlook_dedup
gpt
아웃룩 중복 판별 — 기존 outlook_dedup 로직 재사용.
backend/app/core/steps/outlook_steps.py
47줄outlook_phase3entity_relation v3.202605181858·3판·2절 scene_director v10.202608070006·5판·1절 scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절 모듈 수준 추정background_classify), 도면을 그리고, 그 도면에서 카메라가
무엇을 볼 수 있는지를 기계적으로 되읽는다.
floor_plan_geometry_readback 은 좌표·기하를,
floor_plan_semantic_readback 은 마커가 의미대로 그려졌는지를
따로 확인한다. 이미지 모델은 도면을 그리라고 하면 형태는 맞추고 라벨을
어긋나게 두는 일이 잦다.floor_plan_geometry_readback 은 설정 지문, 도면별 입력 지문
(dossier + 같은 경로의 이미지 bytes), 검토 HTML 존재가 모두 같을 때 성공한
도면을 1비트도 바꾸지 않고 옮긴다. 실패 도면만 다시 읽고, force 는
재사용하지 않는다. 재사용분은 실제 VLM 호출 수에 더하지 않는다.shot_projection_card 가 샷별 가시 범위를 카드로 만들고,
bg_space_partition · dwelling_zone_map 이 plate group 과
거주 구역을 나눈다. 그 위에서 shot_aware_bg_render_plan 이
"이 샷의 배경을 어떤 판으로 렌더할지"를 정한다.
구간 흐름 — 스텝 순서와 의존
flowchart TD EXT[/"앞 구간 산출 12종"/] Nbackground_classify["19.51 배경 그룹 분류\nbackground_classify"] Nbackground_master_plan["19.52 배경 마스터플랜\nbackground_master_plan"] Nfloor_plan_prompt["19.61 도면 t2i 프롬프트\nfloor_plan_prompt"] Nfloor_plan_render(["21.55 도면 이미지 생성\nfloor_plan_render"]) Nfloor_plan_light_sidecar(["21.56 도면 단순화 사이드카 W21B-w5 \nfloor_plan_light_sidecar"]) Nfloor_plan_overlay_payload["21.57 도면 오버레이 페이로드\nfloor_plan_overlay_payload"] Nbase_location_dossier["21.58 기초 위치 정보 W20A \nbase_location_dossier"] Nfloor_plan_geometry_readback["21.59 도면 기하 readback W20A2 \nfloor_plan_geometry_readback"] Nfloor_plan_semantic_readback["21.591 도면 마커 의미 fidelity readback W21B-w4 \nfloor_plan_semantic_readback"] Nshot_projection_card["21.593 샷 projection card — 카메라 가시물 서술 SOT W21B-w4 \nshot_projection_card"] Nbg_space_partition["21.594 BG 공간분할 — plate group / anchor / ref DAG SOT W21B-w5 \nbg_space_partition"] Ndwelling_zone_map["21.5945 dwelling zone map — FP+VLM 공간 묶기 W21B \ndwelling_zone_map"] Nshot_aware_bg_render_plan["21.595 shot-aware BG render plan W20B \nshot_aware_bg_render_plan"] Nbackground_prompt["21.6 배경 t2i 프롬프트\nbackground_prompt"] Nepisode_reference_policy["21.65 에피소드 참조 정책\nepisode_reference_policy"] Nvisual_continuity_anchor["21.66 시각 연속성 anchor W21B-W7 \nvisual_continuity_anchor"] Nbackground_classify --> Nbackground_master_plan Nbackground_master_plan --> Nfloor_plan_prompt Nfloor_plan_prompt --> Nfloor_plan_render Nbackground_master_plan --> Nfloor_plan_render Nfloor_plan_prompt --> Nfloor_plan_light_sidecar Nfloor_plan_prompt --> Nfloor_plan_overlay_payload Nbackground_master_plan --> Nfloor_plan_overlay_payload Nfloor_plan_prompt --> Nbase_location_dossier Nfloor_plan_render --> Nbase_location_dossier Nbackground_master_plan --> Nbase_location_dossier Nfloor_plan_overlay_payload --> Nbase_location_dossier Nbase_location_dossier --> Nfloor_plan_geometry_readback Nfloor_plan_render --> Nfloor_plan_geometry_readback Nbase_location_dossier --> Nfloor_plan_semantic_readback Nfloor_plan_render --> Nfloor_plan_semantic_readback Nbase_location_dossier --> Nshot_projection_card Nfloor_plan_render --> Nshot_projection_card Nfloor_plan_overlay_payload --> Nshot_projection_card Nfloor_plan_geometry_readback --> Nshot_projection_card Nfloor_plan_prompt --> Nshot_projection_card Nbackground_master_plan --> Nshot_projection_card Nbase_location_dossier --> Nbg_space_partition Nfloor_plan_geometry_readback --> Nbg_space_partition Nshot_projection_card --> Nbg_space_partition Nbackground_master_plan --> Ndwelling_zone_map Nfloor_plan_prompt --> Ndwelling_zone_map Nbase_location_dossier --> Ndwelling_zone_map Nfloor_plan_geometry_readback --> Ndwelling_zone_map Nshot_projection_card --> Ndwelling_zone_map Nbase_location_dossier --> Nshot_aware_bg_render_plan Nfloor_plan_geometry_readback --> Nshot_aware_bg_render_plan Nfloor_plan_overlay_payload --> Nshot_aware_bg_render_plan Nbackground_master_plan --> Nshot_aware_bg_render_plan Nbackground_master_plan --> Nbackground_prompt Nfloor_plan_render --> Nbackground_prompt Nfloor_plan_overlay_payload --> Nbackground_prompt EXT -.-> Nbackground_classify EXT -.-> Nbackground_master_plan EXT -.-> Nfloor_plan_prompt EXT -.-> Nshot_projection_card EXT -.-> Nshot_aware_bg_render_plan EXT -.-> Nbackground_prompt EXT -.-> Nepisode_reference_policy EXT -.-> Nvisual_continuity_anchor style Nfloor_plan_render fill:#d6ecff,stroke:#2a6fc8 style Nfloor_plan_light_sidecar fill:#d6ecff,stroke:#2a6fc8 style EXT fill:#fbfbfb,stroke:#bbb
스텝 16개 — 상세
background_classify
gpt
BackgroundClassifyStep — Phase 7 Step 1.
구현 주석 전문
Spec D1: building group clustering + chain_bg/prev_shot_ref classification — single LLM call.
흐름:
1. shot_validator/shot_selection/entity_merge/entity_detail/visual_world_rules 로드
2. shot_count(loc_id별 출현 횟수) 집계
3. _build_locations_from_entities — entity_merge.locations + entity_detail.kind/summary
를 flat list로 만듦 (pre-grouping 없음 — LLM이 cluster 결정)
4. build_classify_user_prompt → run_background_classify (3회 retry)
체크포인트 data:
data.building_groups[] = [{group_id, members[], anchor_loc, kind, rationale}]backend/app/core/steps/background_classify_step.py
149줄shot_validator shot_selection entity_merge entity_detail visual_world_rules scene_directorscene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절building_groups gptbackground_master_plan
gpt
BackgroundMasterPlanStep — Phase 7 Step 2.
구현 주석 전문
각 chain_bg group에 대해 LLM 1회 호출 → master plan 산출. 그룹간 ThreadPool 병렬.
prev_shot_ref 그룹은 skip.
흐름:
1. background_classify + scene_save + shot_validator + shot_selection +
visual_world_rules 체크포인트 로드
2. classify의 chain_bg group만 추려 그룹별 LLM 호출 (ThreadPool 병렬)
3. prev_shot_ref 그룹은 plan=null로 기록 (호출 X)
체크포인트 data:
data.plans = {group_id: {status, plan | error}}backend/app/core/steps/background_master_plan_step.py
733줄background_classify scene_save shot_validator shot_selection visual_world_rulesbackground_classify v4.202605200945·5판·2절 background_master_plan v6.202605290248·6판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절background_catalog bg_catalog_hash diagnostics plans shot_background_map shot_binding_hash gptfloor_plan_prompt
gpt
FloorPlanPromptStep — Phase 7 Step 3.
구현 주석 전문
각 group plan의 floor_plans[]에 대해 LLM 1회씩 t2i prompt 생성. 도면 간에는 depends_on_fp DAG가 있으므로 level 병렬 가능 (대부분 single level).
backend/app/core/steps/floor_plan_prompt_step.py
322줄background_master_plan scene_save shot_validator shot_selection visual_world_rulesbackground_master_plan v6.202605290248·6판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절consumed_bg_catalog_hash consumed_shot_binding_hash floor_plans gptfloor_plan_render
gpt
FloorPlanRenderStep — Phase 7 Step 4.
구현 주석 전문
floor_plan_prompt 결과 + master plan의 depends_on_fp를 따라 PNG 생성. level 병렬 (compute_dag_levels). Phase 7 ImageAsset UPSERT (Phase 5 패턴 미러): - asset_type='floor_plan' - entity_id = primary_loc_id의 EntityCanon.id - variant_index = primary_loc_id 단위 0-base counter (sorted fp_id) - variant_label = 'v00'/'v01'... (counter 기반) - variant_type = fp_id (UPSERT 매치 키, 재실행 idempotent 보장) - is_primary = 1 (counter 0일 때만), 0 (그 외) - file_path = projects_root 기준 relative - prompt_used = t2i_prompt - generation_model = 'gpt-image-2' 도면간 depends_on_fp DAG는 거의 single-level이지만 generic helper로 안전 처리.
backend/app/core/steps/floor_plan_render_step.py
551줄floor_plan_prompt background_master_planbackground_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절floor_plans gptfloor_plan_light_sidecar
gpt
W21B-w5 STEP5-B: FloorPlanLightSidecarStep (NB2 sparse text-to-image).
구현 주석 전문
opt-in (default OFF) producer of a per-fp **simplified floor-plan sidecar PNG** —
a SPARSE CV-readable PARTITION DIAGRAM (thick enclosing walls, an unnumbered
geometry skeleton, only 8-10 essential numbered markers) that the background
renderer reads as an I2I anchor far better than the dense, colored, text-labelled
detailed floor plan.
Winning design (L05 canary, gallery 8815 — user visual gate; supersedes the v0
ref-edit and the first sparse pass):
1. **gpt-5.5 frequency-aware selection** — from the floor_plan_prompt
``numbered_elements`` plus a per-element ``camera_use_count`` (aggregated from
``camera_recommendations`` = how many shot cameras frame each element), the
model picks 8-10 ESSENTIAL numbered markers (a high-frequency element such as
a repeatedly-framed TV/curtain is protected from being dropped) + an
UNNUMBERED geometry skeleton (rooms/walls/doors/windows), and writes a SHORT
``room_schematic_prompt`` with explicit marker-placement constraints (every
circle inside the building outline, door/window markers on their wall, one
circle per number). A long prompt renders badly; few markers render cleanly.
2. **gpt-image-2** PURE text-to-image — NO reference image (a reference
leaks/duplicates marker numbers; the v0 ref-edit produced "11" twice).
``best_of_n`` draws are rendered; the primary sidecar is the FIRST successful
draw, and every draw is persisted for the visual gate. (Render model =
gpt-image-2 per the 2026-06-01 user visual gate: on the same prompt it honours
"one circle per number" far better than Nano Banana 2, which duplicated
markers on repeated office furniture; the residual STRUCTURE issues are an
upstream floor_plan_prompt skeleton problem shared by both models.)
The DETAILED ``floor_plan_render`` PNG is left untouched — it stays the
``shot_projection_card`` / edge-judge substrate, so the W21B-w5 partition SOT is
never disturbed (STEP5-B boundary lock). This step only ADDS a sidecar; the
consumer (``background_render._apply_light_fp_sidecar``) swaps the FP anchor PNG to
the light sidecar when it rendered, and otherwise falls back to the detailed FP
(default behaviour, byte-identical when OFF).
Pipeline order **21.56** — after ``floor_plan_prompt`` (21.5x, source of
``numbered_elements`` + ``camera_recommendations``) and ``floor_plan_render``, and
before ``floor_plan_overlay_payload`` (21.57).
Per fp_id (status ``ok`` in the floor_plan_prompt checkpoint):
1. Aggregate ``camera_use_count`` from ``camera_recommendations``.
2. Build the freq-aware selection bundle → one gpt-5.5 call → validate the
STRUCTURAL skeleton (rooms drawn, no state overlay essential, prompt present).
3. Render ``best_of_n`` NB2 text-to-image draws; persist them; primary = first ok.
4. Persist provenance (essential/skeleton numbers, diagnostics, draws).
5. A selection/render miss / missing data / unsafe id falls back to the detailed
FP for that fp ONLY — never a step failure (optional sidecar).
Validation is STRUCTURAL + render-status only (Codex lock): geometry fidelity (no
duplicate / floating markers) and best-of-N quality are a VISUAL gate + optional
later OCR/VLM diagnostic, NOT a deterministic hard gate (avoids an expensive
false-negative-prone gate that would fall back to the cluttered detailed FP).
Gates (all must be true, else ``not_applicable`` with byte-stable empty data):
- ``settings.background_mode`` ∈ {"on", "floor_plan_anchored"}.
- ``settings.floor_plan_light_sidecar_enabled`` = True.
- ``settings.floor_plan_prompt_version`` ∈ {"6", "7"}.backend/app/core/steps/floor_plan_light_sidecar_step.py
354줄floor_plan_promptfloor_plan_prompt v11.202607170145·11판·2절gptfloor_plan_overlay_payload
gpt
W19B-1: FloorPlanOverlayPayloadStep — deterministic per-bg overlay payload.
구현 주석 전문
``floor_plan_prompt`` (v6) + ``background_master_plan`` checkpoint 만 consume.
LLM / image / VLM API call 0, DB / ImageAsset write 0.
Gates:
- ``settings.background_mode`` ∉ {"on","floor_plan_anchored"} → not_applicable.
- ``settings.floor_plan_prompt_version`` != "6" → not_applicable. default v5
path 는 use/ignore arrays 가 v5 schema 에 없어 의미 없음. v5 callers
그대로 회귀 0.
체크포인트 data shape:
``data.overlays`` = ``{bg_id: per-bg payload}``, build_overlay_payload 출력
그대로. 실패 시 ``data.error`` 가 set 되고 ``failed_count=1``, ``data.overlays``
는 빈 dict.backend/app/core/steps/floor_plan_overlay_payload_step.py
91줄floor_plan_prompt background_master_planbackground_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절overlays gptbase_location_dossier
gpt
W20A: BaseLocationDossierStep — deterministic per-fp dossier producer.
구현 주석 전문
Consumes:
- ``floor_plan_prompt`` (v6) — numbered_elements + base_layer_decision.
- ``floor_plan_render`` — png_path per fp (best-effort).
- ``background_master_plan`` — backgrounds[] DAG per fp.
- ``floor_plan_overlay_payload`` — per-bg overlay payload.
Gates (opt-in, default OFF):
- ``settings.background_mode`` ∉ {"on","floor_plan_anchored"} → not_applicable.
- ``settings.base_location_dossier_enabled`` != True → not_applicable.
- ``settings.floor_plan_prompt_version`` != "6" → not_applicable.
v5 path does not carry base_layer_decision, so a dossier built off
v5 markers would lose the partition contract.
Checkpoint data shape:
``data.dossiers`` = ``{fp_id: dossier_dict}`` (build_dossiers output).
Failure path emits ``data.error`` (truncated str) and an empty
``data.dossiers``.
LLM / image / VLM API call 0, DB / ImageAsset write 0.backend/app/core/steps/base_location_dossier_step.py
106줄floor_plan_prompt floor_plan_render background_master_plan floor_plan_overlay_payloadbackground_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절dossiers gptfloor_plan_geometry_readback
gpt
W20A2: FloorPlanGeometryReadbackStep.
구현 주석 전문
opt-in (default OFF) producer for the geometry-readback bridge between
W20A (base_location_dossier) and W20B (shot-aware LLM planner).
Per fp_id present in the dossier checkpoint, the step:
- Builds a synthetic_fixture readback (W20A2 default — no real VLM).
- Computes geometry candidates (camera cells, look-at cells,
direction vectors, view cone records, visible units/openings
candidates, wall/door diagnostics).
- Renders a review HTML overlay and writes it under the checkpoint
directory.
Gates (all must be true):
- ``settings.background_mode`` ∈ {"on", "floor_plan_anchored"}.
- ``settings.floor_plan_geometry_readback_enabled`` = True.
- ``settings.base_location_dossier_enabled`` = True.
- ``settings.floor_plan_prompt_version`` = "6".
Anything else → ``not_applicable`` with byte-stable empty payload.
LLM / image / VLM API call 0, DB / ImageAsset write 0. The HTML file is
the only sidecar artifact; manifest.json carries summaries + the file's
relative path under the checkpoint dir.
재개 재사용 (2026-08-19 사용자 지시) — 실제 VLM 제공자를 켜면 이 단계는
도면 하나마다 모델을 부르고 **답이 매번 조금씩 다르다**. 그런데 도면 몇
개가 늘 실패해서 스텝이 `partial` 로 남고, `partial` 은 재개마다 다시
불린다. 다시 불릴 때 성공한 도면까지 전부 다시 읽으니 기하 값이 바뀌고,
그 도면을 쓰는 장면이 「재료가 낡았다」로 판정돼 그림이 다시 만들어졌다
(08-19 저녁 한 바퀴에 66장). 그래서 **직전 체크포인트에서 성공한 도면은
그대로 쓰고 실패한 것만 다시 읽는다.** 재사용 조건은 셋 다 만족일 때만
이다 — ①이 스텝의 config_hash 가 같다 ②그 도면의 입력(dossier)이 1비트도
안 바뀌었다 ③산출 HTML 파일이 실재한다. `mode="force"` 는 재사용하지
않는다(force 의 뜻이 "처음부터 다시"이므로).backend/app/core/steps/floor_plan_geometry_readback_step.py
420줄base_location_dossier floor_plan_renderimage_api_call_count llm_call_count per_fp real_vlm_call_count gptfloor_plan_semantic_readback
gpt
W21B-wave-4: FloorPlanSemanticReadbackStep.
구현 주석 전문
opt-in (default OFF) producer of the marker-SEMANTIC fidelity gate.
Per fp_id present in the base-location dossier checkpoint, the step:
- Computes a marker-SEMANTIC readback — does the image content drawn
at each base marker match the expected object class / label? With
the real-provider selector OFF (default) it uses the synthetic
fixture (deterministic placeholder verdicts, NO real VLM call).
- Computes a fail-closed gate (pass / needs_fix / needs_review /
synthetic_unverified).
- Records per-fp readback + gate in the manifest.
Gates (all must be true):
- ``settings.background_mode`` ∈ {"on", "floor_plan_anchored"}.
- ``settings.floor_plan_semantic_readback_enabled`` = True.
- ``settings.base_location_dossier_enabled`` = True.
- ``settings.floor_plan_prompt_version`` ∈ {"6", "7"} (v7 is the
fidelity pack; v7 is schema-compatible with v6 — Rule 11 wording
only — so both are accepted).
Anything else → ``not_applicable`` with a byte-stable empty payload.
This is a SEPARATE gate from the W20A2 geometry readback (marker
number/cell/base-kind). LLM / image / VLM API call is 0 unless the
real-provider selector is explicitly flipped (or a mock provider is
injected in tests). DB / ImageAsset write 0.backend/app/core/steps/floor_plan_semantic_readback_step.py
212줄base_location_dossier floor_plan_rendergptshot_projection_card
gpt
W21B-wave-4 C2: ShotProjectionCardStep.
구현 주석 전문
opt-in (default OFF) producer of the per-shot projection card — the
common shot-observation SOT that BG (``background_prompt`` vNext, C4) and
the final shot t2i (``scene_detail`` vNext, C5) both consume so they
follow the same contract (design brief §3; wiring brief §3).
Per ``(bg_id, shot_id)`` target (one card per shot in the background's
``applies_to_shots``; anchor / plate grouping is deferred to the plan
vNext, C3) the step:
- Assembles the marker inventory + union registry from the overlay
payload (base ∪ transient ∪ ignored), and the source_hashes
provenance from the upstream checkpoints.
- Computes a projection-card VLM output. With the real-provider
selector OFF (default) it uses the synthetic fixture — a
non-authoritative placeholder that NEVER auto-passes the gate, NO
real VLM call.
- Builds the card envelope and runs the v0 deterministic gate
(pass / needs_review / blocked).
- Records per-card envelope + validation in the manifest.
Gates (all must be true):
- ``settings.background_mode`` ∈ {"on", "floor_plan_anchored"}.
- ``settings.shot_projection_card_enabled`` = True.
- ``settings.base_location_dossier_enabled`` = True.
Anything else → ``not_applicable`` with a byte-stable empty payload.
The semantic readback (W21B-wave-4) is an OPTIONAL gate, not a hard dep:
when its checkpoint is present the per-fp ``gate_state`` is carried into
the card; otherwise the card records ``semantic_gate_state=not_available``
and the gate does not treat semantic as a hard precondition (design brief
§10 decision 1). LLM / image / VLM API call is 0 unless the real-provider
selector is explicitly flipped (or a mock provider is injected in tests).
DB / ImageAsset write 0.backend/app/core/steps/shot_projection_card_step.py
376줄base_location_dossier floor_plan_render floor_plan_overlay_payload floor_plan_geometry_readback floor_plan_prompt background_master_plan shot_staging scene_savebackground_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절 shot_staging v22.202608130110·17판·1절gptbg_space_partition
gpt
W21B-w5 (D2): BgSpacePartitionStep.
구현 주석 전문
opt-in (default OFF) producer of the per-fp ``space_partition_plan`` — the
LLM SOT for which background plates share a physical space (same zone), which
anchors each plate, the render action per bg, and the bounded reference tree.
This REPLACES the dwelling-level ``same_physical_space_view`` reference source
that incorrectly chained cross-zone plates (an enclosed bathroom inheriting an
open living-room's plate within a multi-zone dwelling).
Pipeline order **21.594** — after ``shot_projection_card`` (21.593, whose
visible_items seed the judge) and before ``shot_aware_bg_render_plan`` (21.595,
the consumer that mirrors render_action / ref_tree_parents).
Per fp_id the step:
1. Reads the ``base_location_dossier`` checkpoint (the candidate-edge inputs:
``base_marker_inventory`` structural units + ``per_bg_render_facts_by_bg_id``
camera-target floors). Geometry presence is a hard precondition (consistency
with the substrate the FP geometry validated).
2. Builds the deterministic candidate edges (``build_candidate_edges`` — IDF
ubiquity discount + hub isolation; a diagnostic floor, NEVER the final SOT).
3. Adjudicates each borderline candidate with the pass-2 edge judge — a single
text LLM call over the two bgs' projection-card ``visible_items`` (no VLM
re-call). With the real-provider selector OFF (default) the provider is None
and every edge is recorded ``skipped`` (provider_disabled): no strong edge
forms, so each bg keeps its own plate. R3 precondition: an edge is judged
only when BOTH bgs have a real, passed, non-synthetic card with visible
items; otherwise it is ``skipped`` (never a same-space strong parent).
4. Assembles the ``space_partition_plan`` (``build_space_partition_plan`` —
anchor-centered constrained clustering, transitive closure forbidden, hub
never bridges, R2 strong-parent gate at conf >= 0.75 with non-empty
distinctive features).
Cost caps (Codex lock ⑤): a per-fp edge cap and a global LLM-call cap bound the
judge spend. When a cap is hit the remaining edges are recorded ``skipped`` with
the cap reason — never silently dropped, never auto-merged.
Gates (all must be true, else ``not_applicable`` with a byte-stable empty data):
- ``settings.background_mode`` ∈ {"on", "floor_plan_anchored"}.
- ``settings.bg_space_partition_enabled`` = True.
- ``settings.base_location_dossier_enabled`` = True.
LLM call count is 0 unless the real-provider selector is flipped (or a mock
provider is injected in tests). Image / DB / ImageAsset write 0.backend/app/core/steps/bg_space_partition_step.py
312줄base_location_dossier floor_plan_geometry_readback shot_projection_cardshot_projection_card v1.202605302212·1판·2절gptdwelling_zone_map
gpt
W21B (2026-06-08): DwellingZoneMapStep — FP-image + VLM zone grouping.
구현 주석 전문
opt-in (default OFF) producer of a per-dwelling **zone map** that bypasses the
edge-judge (``bg_space_partition``), which cannot group same-dwelling bgs framed
from different camera angles. For each interior dwelling (bgs grouped by their
floor-plan fp_id) the step:
1. assembles a per-bg structural description (priority: shot_projection_card
plate prose → freshness-verified background_prompt t2i → master-plan
catalog labels; dossier structural facts attached as enrichment when
present);
2. (real provider) distils the base-set rooms (gpt-5.5), writes a clean B&W
2D floor-plan prompt (gpt-5.5), renders it (gpt-image-2 text-to-image — a
NEW clean plan, the distorted ``floor_plan_render`` PNG is NOT reused),
then a gpt-5.5 VISION call maps each bg to its plan zone + grid focus;
3. deterministically joins that into the zone-map contract (zones + bg/shot
zone assignments), draws a SEPARATE annotated FP (shot-number overlay,
``must_not_be_used_for_render``) for mapping verification only, and
records a diagnostic comparison against the edge-judge grouping.
The CLEAN render ref and the ANNOTATED (numbered) ref are kept strictly apart
so no downstream i2i anchor can grab the numbered image (number-leak guard).
This step does NOT yet feed any renderer — it only produces + validates the
contract (Phase 1); the background_render zone-1-plate wiring is Phase 2.
Gates (all true, else ``not_applicable`` with byte-stable empty data):
- ``settings.background_mode`` ∈ {"on", "floor_plan_anchored"}.
- ``settings.dwelling_zone_map_enabled`` = True.
- ``settings.floor_plan_prompt_version`` ∈ {"6", "7"}.
When enabled but ``dwelling_zone_map_real_provider_enabled`` is False, every
dwelling gets the non-authoritative synthetic fixture (no LLM/VLM/image call) —
the plumbing path. A per-dwelling provider failure falls back to synthetic for
that dwelling only (never a step failure).backend/app/core/steps/dwelling_zone_map_step.py
545줄background_master_plan floor_plan_prompt base_location_dossier floor_plan_geometry_readback shot_projection_cardbackground_master_plan v6.202605290248·6판·2절 background_prompt v15.202607221105·15판·1절 floor_plan_prompt v11.202607170145·11판·2절 shot_projection_card v1.202605302212·1판·2절gptshot_aware_bg_render_plan
gpt
W20B: ShotAwareBgRenderPlanStep.
구현 주석 전문
opt-in (default OFF) producer for the dwelling-scoped reference graph
+ per-bg camera/reference decisions. Consumes ``base_location_dossier``
(W20A), ``floor_plan_geometry_readback`` (W20A2),
``floor_plan_overlay_payload`` (W19B-1), ``background_master_plan``,
and ``shot_staging``.
Gates (all must be true → run; any false → not_applicable):
- ``settings.background_mode`` ∈ {"on", "floor_plan_anchored"}
- ``settings.shot_aware_bg_render_plan_enabled`` = True
- ``settings.base_location_dossier_enabled`` = True
- ``settings.floor_plan_geometry_readback_enabled`` = True
- ``settings.floor_plan_prompt_version`` = "6"
The step does NOT call any external LLM by default.
``build_render_plan_for_fp(llm_provider=None)`` returns a structurally-
empty plan with diagnostics, so an enable-only flag flip in production
still costs 0 external API calls.
A real LLM smoke is gated on a future wave behind explicit user/Codex
approval. To run a mock/dry smoke, inject an llm_provider via
``set_llm_provider_for_testing``.
No image / VLM / DB / ImageAsset write. Output is checkpoint-only.backend/app/core/steps/shot_aware_bg_render_plan_step.py
491줄base_location_dossier floor_plan_geometry_readback floor_plan_overlay_payload background_master_plan shot_stagingbackground_master_plan v6.202605290248·6판·2절 shot_projection_card v1.202605302212·1판·2절 shot_staging v22.202608130110·17판·1절llm_provider_attempts_per_fp per_fp real_api_call_counts shot_staging_index_diagnostics gptbackground_prompt
gpt
BackgroundPromptStep — Phase 7 Step 5 / Phase 8 v2.
구현 주석 전문
각 master plan의 backgrounds[]에 대해 LLM 1회씩 t2i prompt 생성. depends_on_bg DAG로 level 병렬화. (이 step은 prompt만 — PNG는 T14 background_render). Phase 8 v2: ``floor_plan_prompt`` 체크포인트(``data.floor_plans[fp_id]``)에서 ``numbered_elements`` + ``camera_recommendations`` 를 로드해 bg_id 기준 flat 매핑을 만들고, ``build_bg_user_prompt`` 에 inject한다. 매핑 키는 master_plan 의 ``backgrounds[].depends_on_fp[0]`` 으로 fp_id 를 결정 (master_plan invariant 4: 같은 sub_location 은 같은 fp).
backend/app/core/steps/background_prompt_step.py
450줄background_master_plan floor_plan_render floor_plan_overlay_payload scene_save shot_validator shot_selection visual_world_rulesbackground_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절 shot_aware_bg_render_plan v3.202607231435·6판·3절 shot_projection_card v1.202605302212·1판·2절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절backgrounds consumed_bg_catalog_hash consumed_shot_binding_hash gptepisode_reference_policy
gpt
Step 21.65: episode reference necessity manifest 계산.
backend/app/core/steps/episode_reference_policy_step.py
98줄shot_director shot_selection shot_validator entity_merge entity_relationshot_director v6.202605172247·6판·2절 shot_selection v7.202607222349·6판·2절policy schema_version gptvisual_continuity_anchor
gpt
Step 21.66: 시각 연속성 anchor manifest (W21B-W7).
backend/app/core/steps/visual_continuity_anchor_step.py
494줄scene_save shot_validator shot_selection shot_dependency shot_staging shot_director entity_t2ientity_relation v3.202605181858·3판·2절 scene_detail v42.202608121750·37판·1절 shot_dependency_t2i v9.202608040240·6판·1절 shot_director v6.202605172247·6판·2절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절diagnostics groups review_html schema_version gptt2i_prompt 는
한 순간·한 시공간만 담는다. ①변형 캐릭터는 그 순간의 형태 ID 하나만
②몽타주·회상·인터컷·꿈·평행액션이 섞인 씬은 하나만 선택 ③씬에 배정된
전체 인물을 한 컷에 다 넣지 않는다. 콘티형으로 단순하게 — 한 컷 = 한 문장,
인물 2~3명이 최대다.t2i_review 가 프롬프트를 검수하고, VE 위반(배정되지 않은 엔티티
등장)이 발견되면 retry 후 강제 제거한다.
구간 흐름 — 스텝 순서와 의존
flowchart TD EXT[/"앞 구간 산출 15종"/] Nscene_detail["21.7 씬 상세 분석 병렬 \nscene_detail"] Nshot_dependency_t2i["21.71 Shot 연관 재계산 LLM \nshot_dependency_t2i"] Nt2i_review["21.72 T2I 프롬프트 검수\nt2i_review"] Nzoom_continuity_anchor["21.73 zoom continuity anchor W21B-W7 W-C1 \nzoom_continuity_anchor"] Nscene_detail --> Nshot_dependency_t2i Nscene_detail --> Nt2i_review Nshot_dependency_t2i --> Nzoom_continuity_anchor Nscene_detail --> Nzoom_continuity_anchor Nt2i_review --> Nzoom_continuity_anchor EXT -.-> Nscene_detail EXT -.-> Nshot_dependency_t2i EXT -.-> Nt2i_review EXT -.-> Nzoom_continuity_anchor style Nscene_detail fill:#e8f5e9,stroke:#2e7d32 style Nshot_dependency_t2i fill:#e8f5e9,stroke:#2e7d32 style EXT fill:#fbfbfb,stroke:#bbb
스텝 4개 — 상세
scene_detail
gemini-pro
Step 16: 씬 상세 분석 (ThreadPool 병렬). visible_entities는 확정 데이터에서 구축.
backend/app/core/steps/detail_steps.py
2670줄shot_dependency shot_director outlook_phase3 entity_t2i shot_staging scene_consistency background_prompt episode_reference_policy visual_continuity_anchorbackground_master_plan v6.202605290248·6판·2절 scene_detail v42.202608121750·37판·1절 scene_detail_owned_repair v1.202605202107·1판·2절 scene_extractor_v2 v21.202605201351·7판·4절consumed_bg_catalog_hash consumed_shot_binding_hash scenes gemini-proshot_dependency_t2i
gpt-mini
T2I 기반 shot 연관 재계산 — LLM이 스토리 연관성으로 판단.
backend/app/core/steps/shot_dependency_t2i_step.py
229줄scene_detail scene_consistencyscene_detail v42.202608121750·37판·1절 scene_director v10.202608070006·5판·1절 shot_dependency_t2i v9.202608040240·6판·1절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절dependencies gpt-minit2i_review
gpt
entity_t2i와 scene_detail의 T2I 프롬프트를 검수하고 치환 적용.
backend/app/core/steps/t2i_review_step.py
172줄entity_t2i scene_detail shot_validator shot_staging visual_world_rules entity_merge entity_detailscene_detail v42.202608121750·37판·1절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절 t2i_review v7.202605190201·9판·2절 visual_world_rules v10.202607080130·10판·1절zoom_continuity_anchor
gpt
Step 21.73: zoom continuity anchor + revised wide prompt (W21B-W7 W-C1).
backend/app/core/steps/zoom_continuity_anchor_step.py
370줄shot_dependency_t2i scene_detail t2i_review scene_save shot_validator shot_selection shot_stagingscene_detail v42.202608121750·37판·1절 shot_dependency_t2i v9.202608040240·6판·1절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절diagnostics groups review_html schema_version gpt· 뼈대(형태) = 선 스케치 — 층수·개구부·계단 주행이 또렷하다
· 표면(재질·풍화·분위기) = 검색으로 회수한 실제 사진
· 표시면의 글자 = 작품의 것(참조의 상호는 절대 베끼지 않는다)
· 없는 정보 = 사전조사(typology prior)가 원본어 검색으로 메운다
한 장의 참조에 전부 맡기면 나쁜 참조의 구조가 그대로 전이된다 — 실측으로 확인된 결함이고, 권위 분리가 그것을 끊었다.
outdoor_structure_form_reference 와
outdoor_structure_seed 둘뿐이다. seed_plan ·
skeleton · place_mark 는 설계·실험만 끝났고 스텝 파일이
없다. 사전조사 모듈(typology_prior)은 존재하지만 아무 스텝도
호출하지 않는다. 심층 상세도는
야외 구조물 개발자 상세도 에 있다.구간 흐름 — 스텝 순서와 의존
flowchart TD EXT[/"앞 구간 산출 12종"/] Noutdoor_site_layout["21.76 야외 site layout 좌표 SOT W21B-W8 \noutdoor_site_layout"] Noutdoor_place_spec["21.77 야외 장소 마커 스펙 W22 직행 ① \noutdoor_place_spec"] Noutdoor_lane_plan["21.775 야외 3레인 lane plan 설계 v2 ① \noutdoor_lane_plan"] Noutdoor_place_canon(["21.78 장소 캐논 자산 W22 직행 ② \noutdoor_place_canon"]) Noutdoor_frame_mode["21.78 레인2 구도 판정 E2E6 ③ \noutdoor_frame_mode"] Noutdoor_shot_grounding["21.79 야외 샷 grounding W22 직행 ③ \noutdoor_shot_grounding"] Nshot_ref_classify["21.9 샷 참조 분류 레시피 \nshot_ref_classify"] Nbackground_share_plan["21.905 배경 공유 계획 전체 지휘 \nbackground_share_plan"] Nshot_continuity["21.91 샷 연속성 저작 레시피 \nshot_continuity"] Noutdoor_structure_form_reference["21.915 야외 구조물 형태 참조 검색·선택 Stage D 선행 \noutdoor_structure_form_reference"] Noutdoor_structure_seed["21.92 야외 레인2 구조물 seed Stage D \noutdoor_structure_seed"] Noutdoor_place_spec --> Noutdoor_lane_plan Noutdoor_lane_plan --> Noutdoor_place_canon Noutdoor_place_spec --> Noutdoor_place_canon Noutdoor_lane_plan --> Noutdoor_frame_mode Noutdoor_place_spec --> Noutdoor_frame_mode Noutdoor_place_spec --> Noutdoor_shot_grounding Noutdoor_place_canon --> Noutdoor_shot_grounding Noutdoor_lane_plan --> Noutdoor_structure_form_reference Noutdoor_place_spec --> Noutdoor_structure_form_reference Noutdoor_lane_plan --> Noutdoor_structure_seed Noutdoor_place_spec --> Noutdoor_structure_seed Nshot_ref_classify --> Noutdoor_structure_seed Noutdoor_structure_form_reference --> Noutdoor_structure_seed EXT -.-> Noutdoor_site_layout EXT -.-> Noutdoor_place_spec EXT -.-> Noutdoor_lane_plan EXT -.-> Noutdoor_frame_mode EXT -.-> Noutdoor_shot_grounding EXT -.-> Nshot_ref_classify EXT -.-> Nbackground_share_plan EXT -.-> Nshot_continuity EXT -.-> Noutdoor_structure_form_reference EXT -.-> Noutdoor_structure_seed style Noutdoor_place_canon fill:#d6ecff,stroke:#2a6fc8 style EXT fill:#fbfbfb,stroke:#bbb
현행 — 검색 그라운딩 형태 참조 (21.915) 내부
flowchart TD S1["place spec items 유무로 대상 선별
spec 결손 = no_spec 으로 명시 제외"] S2["검색 지시문 저작
원본어 질의 · 작품 고유명사 배제"] S3["웹 검색 · 후보 다운로드
cand_NN.png"] S4{"이중 판정
GPT + Gemini"} S5["form_ref 확정
path + sha256 + asset_id"] S6["mandatory_group_ids
= 소비자의 fail-closed 기준"] S1 --> S2 --> S3 --> S4 --> S5 --> S6 S4 -. "회수 부족" .-> S3 style S4 fill:#fff3d6,stroke:#c8922a style S5 fill:#d6ecff,stroke:#2a6fc8 style S6 fill:#e8f5e9,stroke:#2e7d32
현행 — 구조물 씨드 (21.92) 내부 루프
flowchart TD B["브리프 저작
규모 · 층수 · 재질 · 표시 문안"] R["3변형 롤 생성
form_ref 를 참조로 첨부"] J{"judge
층수 계수 절차 · 현실감 PASS/FAIL"} C["critique
결함 목록"] F["i2i 수정"] RJ{"수정본 재판정
원본 포함 2후보 블라인드"} OUT(["확정 씨드"]) B --> R --> J --> C --> F --> RJ --> OUT J -. "eligible 0 = fail-closed" .-> X["그룹 실패
가장 덜 나쁜 후보 채택 금지"] style J fill:#fff3d6,stroke:#c8922a style RJ fill:#fff3d6,stroke:#c8922a style OUT fill:#d6ecff,stroke:#2a6fc8 style X fill:#ffe0e0,stroke:#c62828
목표 — 5스텝 계보 (설계 확정 · 대부분 미구현)
flowchart TD A["21.915 form_reference
후보 풀 · form_ref · look_ref · 이름 관례"] B["21.916 seed_plan
저작 A + 전략 판정 B"] C["21.917 skeleton
선 스케치 + 구조 게이트"] D["21.92 seed
뼈대 + 표면 2권위 합성"] E["21.925 place_mark
표시면 재작화 · effective_seed"] P["사전조사 typology_prior
siting → scale → composition → naming"] P -. "침묵한 항목만" .-> B A --> B --> C --> D --> E style A fill:#d6ecff,stroke:#2a6fc8 style B fill:#efe3ff,stroke:#7b4fbd style C fill:#efe3ff,stroke:#7b4fbd style D fill:#efe3ff,stroke:#7b4fbd style E fill:#efe3ff,stroke:#7b4fbd style P fill:#fff3d6,stroke:#c8922a
siting(입지)을 먼저
묻지 않고 규모를 물으면, 틀린 유형을 조사한 뒤 그 가정에 인용을
붙여 준다 — validator 가 "첫 문항은 siting" 을 강제한다. 채택 규칙도
"두 검색 일치"에서 [single source] 생존으로 개정됐다.
초판이 가장 필요한 항목을 버렸기 때문이다.스텝 11개 — 상세
outdoor_site_layout
gpt
Step 21.76: outdoor site layout 좌표 SOT + 위치 구절 재작문 (W21B-W8).
backend/app/core/steps/outdoor_site_layout_step.py
1270줄scene_detail t2i_review background_classify shot_dependency_t2i scene_save shot_validator shot_selection shot_staging shot_directorbackground_classify v4.202605200945·5판·2절 background_master_plan v6.202605290248·6판·2절 scene_detail v42.202608121750·37판·1절 scene_director v10.202608070006·5판·1절 shot_dependency_t2i v9.202608040240·6판·1절 shot_director v6.202605172247·6판·2절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절composition_guides diagnostics groups prompt_overrides review_html schema_version gptoutdoor_place_spec
gpt
야외 장소 마커 스펙 (W22 ①) — evidence-bound 저작 + 결정론 검증.
backend/app/core/steps/outdoor_place_spec_step.py
221줄background_classify scene_save scene_director shot_validator shot_selection shot_staging entity_merge visual_world_rulesbackground_classify v4.202605200945·5판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절groups gptoutdoor_lane_plan
gpt
야외 lane plan (3레인 ①) — 스펙+씬 전문+선택 샷 → 세그먼트/레인.
backend/app/core/steps/outdoor_lane_plan_step.py
194줄outdoor_place_spec scene_save scene_director shot_validator shot_selection shot_stagingoutdoor_place_spec v3.202607251954·3판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절groups gptoutdoor_place_canon
gpt
장소 캐논 자산 (W22 ②) — nb2 3롤→이중 판정→수정→gpt 재투영 맵.
backend/app/core/steps/outdoor_place_canon_step.py
417줄outdoor_lane_plan outdoor_place_specfloor_plan_prompt v11.202607170145·11판·2절 outdoor_lane_plan v4.202607251321·4판·2절 outdoor_place_canon v4.202607260153·4판·5절 outdoor_place_spec v3.202607251954·3판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절groups gptoutdoor_frame_mode
gpt
레인2 frame_mode 판정 (분류 전용 — 이미지 생성 없음).
backend/app/core/steps/outdoor_frame_mode_step.py
184줄outdoor_lane_plan outdoor_place_spec scene_save shot_validator shot_selection shot_staging scene_directoroutdoor_lane_plan v4.202607251321·4판·2절 outdoor_place_spec v3.202607251954·3판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절outdoor_shot_grounding
gpt
샷 grounding (W22 ③) — 맵+범례+샷+씬 전문 → 존/앵커/카메라.
backend/app/core/steps/outdoor_shot_grounding_step.py
193줄outdoor_place_spec outdoor_place_canon scene_save scene_director shot_validator shot_selection shot_stagingoutdoor_place_canon v4.202607260153·4판·5절 outdoor_place_spec v3.202607251954·3판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절shot_ref_classify
gpt
샷 참조 분류 — bgonly·prev v3·time_of_day (레시피 이식).
backend/app/core/steps/shot_ref_classify_step.py
133줄shot_validator shot_selection scene_save scene_directorscene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절scenes shots world_anchor_en gptbackground_share_plan
gpt
background_share_plan 스텝 — 에피소드 전체 배경 공유·참조 계획 (B-2).
구현 주석 전문
2026-07-19 사용자 확정: 샷별 개별 판정 대신 에피소드 전체를 조망하는 LLM 계획으로 '배경 참조 vs 앞쪽 샷(prev) 참조'를 구분 지휘. 스틸 소비 시 이 계획이 shot_ref_classify prev 판정의 상위 권위(부재=기존 판정 fail-safe). flag ``background_share_plan_enabled`` default OFF — OFF=no-op(불변).
backend/app/core/steps/background_share_plan_step.py
142줄shot_validator shot_selection scene_save scene_directorbackground_share_plan v1.202607190212·1판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절attempts plan shot_tags gptshot_continuity
gpt
샷 연속성 저작 — pose_canon·pose_fix·carried (레시피 이식).
backend/app/core/steps/shot_continuity_step.py
134줄shot_validator shot_selection scene_save entity_mergeshot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절carried pose_canon pose_fix gptoutdoor_structure_form_reference
gpt
구조물마다 실사 형태 참조 1장을 검색·선택해 영속한다.
backend/app/core/steps/outdoor_structure_form_reference_step.py
1327줄outdoor_lane_plan outdoor_place_spec background_classify entity_merge scene_save visual_world_rulesbackground_classify v4.202605200945·5판·2절 outdoor_lane_plan v4.202607251321·4판·2절 outdoor_place_spec v3.202607251954·3판·2절 visual_world_rules v10.202607080130·10판·1절groups mandatory_group_ids target gptoutdoor_structure_seed
gemini-image
레인2 구조물 seed (Stage D) — 순수 T2I 멀티롤 (siteplan 없음).
backend/app/core/steps/outdoor_structure_seed_step.py
1157줄outdoor_lane_plan outdoor_place_spec background_classify entity_merge scene_save shot_ref_classify outdoor_structure_form_reference shot_validator shot_selection shot_staging scene_directorbackground_classify v4.202605200945·5판·2절 outdoor_lane_plan v4.202607251321·4판·2절 outdoor_place_spec v3.202607251954·3판·2절 scene_director v10.202608070006·5판·1절 shot_ref_classify v4.202608071400·4판·5절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절 structure_seed v5.202607221100·5판·6절groups gemini-imageref_image_gen), 인물+아웃룩을 합성하고(composite_image_gen),
상태 변형을 따로 만든다(character_state_variant). 배경은
background_render 가 그리고, shot_conti_light 가 경량
콘티를 얹은 뒤 scene_image_pipeline 이 최종 샷을 합성한다.nb2(Gemini image)이고 설정으로
grok2(xAI Grok Imagine 2.0)를 고를 수 있다. 생성 엔진과 무관하게
시네마틱 변환을 켜면 선정 원본 한 장을 Grok i2i 로 변환하며, 선정 원본은
이전 샷 연속성 앵커로 보존한다.needs_ref_indices 를 구조 필드로 내고, 수정 호출은
요구된 참조만 붙인다. 선별 칸이 없는 지적이 하나라도 섞인 옛 기록은 안전하게
전부 첨부하며, 없는 엔티티를 새로 넣으라는 지적은 전용 지시 절을 더한다.
선별 여부와 누락은 records.json 의 fix_ref_gate에 남는다.429·5xx 오류도 제한 횟수 안에서 다시 보내되,
검열 거부는 비용만 반복되므로 이 재시도에서 제외한다.declined를
기록하고 원본을 최종본으로 확정한다. 다음 재개는 유료 변환을 다시 부르지
않으며, 원본 지문이 바뀌면 새 입력으로 다시 시도한다.구간 흐름 — 스텝 순서와 의존
flowchart TD EXT[/"앞 구간 산출 19종"/] Nworld_guide(["22 월드 가이드\nworld_guide"]) Nspace_set_bg(["22.5 space set BG — frame/addon/life 3층 공간 세트 W21B \nspace_set_bg"]) Nref_image_gen(["23 요소 참조 이미지\nref_image_gen"]) Ncomposite_image_gen(["24 인물+아웃룩 합성 이미지\ncomposite_image_gen"]) Ncharacter_state_variant(["24.5 인물 상태 변형 참조 이미지\ncharacter_state_variant"]) Nbackground_render(["24.72 배경 이미지 생성\nbackground_render"]) Nshot_conti_light(["24.73 경량 콘티 레시피 \nshot_conti_light"]) Nscene_image_pipeline(["25 씬 이미지 생성 compound \nscene_image_pipeline"]) Nworld_guide --> Nspace_set_bg Nref_image_gen --> Ncomposite_image_gen Ncomposite_image_gen --> Ncharacter_state_variant Nbackground_render --> Nshot_conti_light Ncomposite_image_gen --> Nscene_image_pipeline Nworld_guide --> Nscene_image_pipeline Ncharacter_state_variant --> Nscene_image_pipeline Nbackground_render --> Nscene_image_pipeline Nshot_conti_light --> Nscene_image_pipeline EXT -.-> Nworld_guide EXT -.-> Nspace_set_bg EXT -.-> Nref_image_gen EXT -.-> Ncomposite_image_gen EXT -.-> Ncharacter_state_variant EXT -.-> Nbackground_render EXT -.-> Nshot_conti_light EXT -.-> Nscene_image_pipeline style Nworld_guide fill:#d6ecff,stroke:#2a6fc8 style Nspace_set_bg fill:#d6ecff,stroke:#2a6fc8 style Nref_image_gen fill:#d6ecff,stroke:#2a6fc8 style Ncomposite_image_gen fill:#d6ecff,stroke:#2a6fc8 style Ncharacter_state_variant fill:#d6ecff,stroke:#2a6fc8 style Nbackground_render fill:#d6ecff,stroke:#2a6fc8 style Nshot_conti_light fill:#d6ecff,stroke:#2a6fc8 style Nscene_image_pipeline fill:#d6ecff,stroke:#2a6fc8 style EXT fill:#fbfbfb,stroke:#bbb
이미지 계보 — 무엇이 무엇을 참조하는가
flowchart TD E["엔티티 T2I 프롬프트
15 entity_t2i"] R(["23 ref_image_gen
인물 참조"]) O(["24 composite_image_gen
인물 + 아웃룩"]) V(["24.5 character_state_variant
상태 변형"]) BG(["24.72 background_render
배경 판"]) SEED(["21.92 구조물 씨드"]) CT(["24.73 shot_conti_light
러프 콘티"]) FIN(["25 scene_image_pipeline
최종 샷"]) E --> R --> O --> V SEED -.-> BG BG --> CT O -. "인물 참조" .-> FIN V -. "변형 상태" .-> FIN BG --> FIN CT --> FIN style FIN fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px style SEED fill:#efe3ff,stroke:#7b4fbd
스텝 8개 — 상세
world_guide
gpt
이미지 Phase StepRunner 서브클래스 — Steps 11-14.
구현 주석 전문
force 모드: 기존 이미지 삭제 안 함. 새 이미지 추가 생성 (is_primary 이동). resume 모드: 미완성분만 이어서 생성.
backend/app/core/steps/image_steps.py
63줄entity_t2i scene_detailcharacter_state_variant v1.202604101200·1판·1절 shot_staging v22.202608130110·17판·1절 still_recipe v22.202608180100·22판·5절 모듈 수준 추정continuity_guardrails costume_guardrails era_guardrails image_generation_notes location_guardrails prohibited_visual_misreads prop_guardrails style_rules technology_level world_setting_summary world_time_period gptspace_set_bg
gpt
frame/addon/life 3층 공간 세트 BG 파이프라인 step.
backend/app/core/steps/space_set_bg_step.py
486줄background_master_plan world_guide scene_save shot_validator shot_selection scene_directorbackground_master_plan v6.202605290248·6판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절ref_image_gen
gemini-image
이미지 Phase StepRunner 서브클래스 — Steps 11-14.
구현 주석 전문
force 모드: 기존 이미지 삭제 안 함. 새 이미지 추가 생성 (is_primary 이동). resume 모드: 미완성분만 이어서 생성.
backend/app/core/steps/image_steps.py
113줄entity_t2icharacter_state_variant v1.202604101200·1판·1절 shot_staging v22.202608130110·17판·1절 still_recipe v22.202608180100·22판·5절 모듈 수준 추정failed generated low_freq_skipped outlook_generated outlook_skipped skipped skipped_composite_phase total gemini-imagecomposite_image_gen
gemini-image
이미지 Phase StepRunner 서브클래스 — Steps 11-14.
구현 주석 전문
force 모드: 기존 이미지 삭제 안 함. 새 이미지 추가 생성 (is_primary 이동). resume 모드: 미완성분만 이어서 생성.
backend/app/core/steps/image_steps.py
261줄ref_image_gen outlook_phase3character_state_variant v1.202604101200·1판·1절 shot_staging v22.202608130110·17판·1절 still_recipe v22.202608180100·22판·5절 모듈 수준 추정combo_total composite_done gemini-imagecharacter_state_variant
gemini-image
죽은/다친 인물의 상태 variant 참조 이미지 생성.
backend/app/core/steps/image_steps.py
369줄composite_image_gen shot_stagingcharacter_state_variant v1.202604101200·1판·1절 shot_staging v22.202608130110·17판·1절state_variants gemini-imagebackground_render
gpt
BackgroundRenderStep — Phase 7 Step 6.
구현 주석 전문
각 master plan background를 gpt-image-2로 PNG 생성. ``depends_on_bg`` DAG →
``compute_dag_levels`` 로 level 분할 후 level 내부는 ThreadPool 병렬.
출력 shape는 Phase 5 ``chain_bg_render`` 와 호환:
``data.groups[bg_id].{status, location_id, png_path, t2i_prompt,
shot_guides, shot_ids, parent_id, ref_used, ...}``.
이렇게 해야 Phase 6 ``scene_context_loader._load_chain_bg_guide_by_shot``
가 변경 없이 동작.
Phase 7 ImageAsset UPSERT (Phase 5 chain_bg 패턴 미러):
- asset_type='chain_bg'
- entity_id = loc_id의 EntityCanon.id
- variant_index = loc_id 단위 1+ counter (sorted bg_id, gen_order). v00은
floor_plan(primary)에 예약.
- variant_label = state_label
- variant_type = bg_id (UPSERT 매치 키, 재실행 idempotent 보장)
- is_primary = 0 (chain_bg는 항상 0; v00 floor_plan만 1)
- t2i_guide = shot_guides[]를 newline join (Phase 6 scene_detail consumer 가
이를 prepend하여 chain_bg PNG 가구 위치 가이드를 scene t2i에 주입)
- file_path = projects_root 기준 relativebackend/app/core/steps/background_render_step.py
3742줄floor_plan_overlay_payload background_prompt floor_plan_render background_master_planbackground_classify v4.202605200945·5판·2절 background_master_plan v6.202605290248·6판·2절 background_prompt v15.202607221105·15판·1절 floor_plan_prompt v11.202607170145·11판·2절 shot_aware_bg_render_plan v3.202607231435·6판·3절bg_reference_catalog consumed_bg_catalog_hash consumed_shot_binding_hash groups gptshot_conti_light
gpt-image-2
경량 콘티 — 플레이트 느슨 참조 단일 프레임 (레시피 이식).
backend/app/core/steps/shot_conti_light_step.py
1813줄outdoor_lane_plan outdoor_structure_seed shot_ref_classify shot_continuity shot_validator shot_selection scene_save scene_director background_render outdoor_place_spec outdoor_place_canon background_share_planbackground_share_plan v1.202607190212·1판·2절 marker_map_sketch v14.202607270344·14판·9절 outdoor_lane_plan v4.202607251321·4판·2절 outdoor_marker_geometry v4.202607270248·4판·2절 outdoor_place_canon v4.202607260153·4판·5절 outdoor_place_spec v3.202607251954·3판·2절 scene_director v10.202608070006·5판·1절 shot_conti_light v5.202607222353·5판·12절 shot_continuity v2.202607161500·2판·3절 shot_ref_classify v4.202608071400·4판·5절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절conti_pack contis lane_conti map_conti gpt-image-2scene_image_pipeline
mixed
이미지 Phase StepRunner 서브클래스 — Steps 11-14.
구현 주석 전문
force 모드: 기존 이미지 삭제 안 함. 새 이미지 추가 생성 (is_primary 이동). resume 모드: 미완성분만 이어서 생성.
backend/app/core/steps/image_steps.py
990줄composite_image_gen world_guide character_state_variant background_render shot_ref_classify shot_continuity shot_conti_light background_share_planstill_recipe v22.202608180100·22판·5절primary_count scene_total mixed스텝은 서로를 직접 부르지 않는다. 앞 스텝이 체크포인트에 남긴 것만 읽는다 — 그래서 중간부터 재개할 수 있고, 어느 스텝이 무엇을 망쳤는지 되짚을 수 있다. 이 탭은 그 계약을 설명한다.
체크포인트 manifest 필드
| 필드 | 뜻 | 왜 있나 |
|---|---|---|
step_id · run_id | 스텝 식별자와 실행 회차 | 같은 스텝을 다시 돌렸을 때 어느 회차 산출인지 구분한다. |
status | completed / failed / running |
running 인 채로 남으면 스테일 락이 된다. 아래 참조. |
data | 이 스텝의 산출 본문 | 다음 스텝이 읽는 유일한 창구. 각 스텝 카드의 "CP 산출"이 실측 키다. |
schema_version | data 구조의 버전 | 구조가 바뀌면 올린다. 소비자가 구 CP 를 그대로 먹지 않게 막는다. |
config_hash | 실질 입력의 지문 | 모델·팩·플래그가 바뀌면 값이 달라져 재실행 대상이 된다. 유효성 판정 장치가 아니다 — hash 가 달라도 실행은 되므로, 불가능한 조합은 별도 정책 SOT 가 실행 전에 거부한다. |
resolved_model | alias 뒤의 실제 모델 | gpt 같은 alias 는 설정으로 바뀐다. 무엇이 실제로 돌았는지 남긴다. |
applicable_count · completed_count · failed_count |
대상 수 / 성공 / 실패 | 부분 성공을 그대로 기록한다 — 실패를 0으로 덮지 않는다. |
project_config_snapshot | 실행 시점 설정 사본 | 나중에 설정이 바뀌어도 그때 무엇으로 돌았는지 재구성할 수 있다. |
예 — outdoor_structure_form_reference: schema v5, 해석 모델 gpt, data 키 3개 (groups mandatory_group_ids target …)
재개 · 락 · 재시도
force 로 뺏을 수 없다.
만료 판정은 started_at 기준 3600초이고, 회수는 resume
경로에서만 일어난다. 게다가 재시도가 started_at 을 갱신해
만료가 계속 미뤄진다(3577초 → 425초로 리셋된 실측이 있다). 대응은 두드리는
것이 아니라 3600초를 넘긴 뒤 resume 을 한 번 부르는 것이다.failed_count 와 그룹 status 에 남는다.
다만 fail-closed 로 잠근 자리(형태 참조 결손 등)는 조용히 degrade 하지
않고 그 그룹을 세운다 — 조용한 하강이 사용자 지시를 아무도 모르게 어기기 때문이다.병렬과 모델 alias
- fan-out 표시가 있는 스텝은 씬·샷·그룹 단위로 병렬 실행된다. 카드의 칩으로 표시했다.
- 모델은
gpt·gemini-pro같은 alias 로 적히고 설정이 물리 모델로 푼다. alias 뒤가 바뀌면 산출이 달라지므로 일부 스텝은 물리 모델까지config_hash에 싣는다. - 이미지·VLM 판정은 이중 판정(GPT + Gemini)을 쓰는 자리가 있다. 한쪽 심판이 평균을 지배하던 결함이 실측돼 척도를 맞췄다.
이 문서의 사실 출처
스텝 메타 = app/core/step_manifest.py ·
구현/설명 = 스텝 클래스 docstring · 팩 = prompts/_base/ 디렉터리 ·
CP 산출 키 = 실제 실행 체크포인트 72개에서 실측(작품 식별자는
싣지 않는다). 빌더 = docs/architecture/_build_pipeline_doc.py.
매니페스트 전수 84행. order 순.
| order | step_id | 이름 | 모델 | type | 적용 조건 | 병렬 | lifecycle | 구현 파일 |
|---|---|---|---|---|---|---|---|---|
| 0 | planning_doc_analysis |
기획서 분석 | gemini-lite |
transform | if_planning_doc | active | planning_doc_step.py |
|
| 1 | text_cleanup |
텍스트 정리 | gemini-lite |
transform | always | active | text_steps.py |
|
| 2 | scene_segmentation |
씬 세그먼테이션 | gemini-flash |
transform | always | active | scene_steps.py |
|
| 3 | episode_summary |
에피소드 요약 | gpt-mini |
transform | always | active | summary_steps.py |
|
| 4 | visual_world_rules |
시각적 세계관 규칙 | gpt |
transform | always | active | summary_steps.py |
|
| 5 | scene_split |
큰 씬 분할 (레거시) | gemini-flash |
transform | on_demand | ✓ | deprecated | scene_steps.py |
| 6 | scene_save |
씬 저장 | - |
transform | always | active | scene_steps.py |
|
| 6.5 | entity_character_list |
인물 리스트 (사전 추출) | gpt |
transform | always | active | character_list_step.py |
|
| 7 | scene_summary |
씬별 요약 (병렬) | gpt-mini |
transform | always | ✓ | active | summary_steps.py |
| 7.1 | beat_extract |
Beat 추출 (병렬) | gemini-pro |
transform | always | ✓ | active | beat_shot_steps.py |
| 7.2 | shot_extract |
Shot 추출 (순차) | gemini-pro |
transform | always | ✓ | active | beat_shot_steps.py |
| 7.25 | shot_validator |
Shot 검증 | gemini-pro |
transform | always | ✓ | active | shot_validator_step.py |
| 8 | entity_all_character |
인물 리스팅 | gpt |
transform | always | active | entity_steps.py |
|
| 9 | entity_extract_character |
인물 추출 | gpt |
transform | always | active | entity_steps.py |
|
| 10 | entity_all_location |
배경 리스팅 | gpt |
transform | always | active | entity_steps.py |
|
| 11 | entity_extract_location |
배경 추출 | gemini-pro |
transform | always | active | entity_steps.py |
|
| 12 | entity_all_prop |
소품 리스팅 | gpt |
transform | always | active | entity_steps.py |
|
| 13 | entity_extract_prop |
소품 추출 | gemini-pro |
transform | always | active | entity_steps.py |
|
| 13.5 | entity_merge |
요소 중복 병합 | gpt |
transform | always | active | entity_steps.py |
|
| 13.6 | entity_relation |
요소 변형 관계 추출 | gpt |
transform | always | active | entity_relation_step.py |
|
| 13.7 | entity_filter |
저빈도 요소 필터링 | gpt-mini |
transform | always | active | entity_steps.py |
|
| 14 | entity_detail |
요소 상세 + enum | gpt |
transform | always | active | entity_steps.py |
|
| 15 | entity_t2i |
요소 T2I 프롬프트 (병렬) | gemini-pro |
transform | always | ✓ | active | entity_steps.py |
| 15.5 | shot_selection |
중요 샷 선택 (병렬) | gpt-mini |
transform | always | ✓ | active | shot_selection_step.py |
| 16 | scene_director |
씬 감독 (물리적 존재) | gemini-pro |
transform | always | active | director_steps.py |
|
| 16.5 | shot_director |
Shot별 VE 판정 | gpt |
transform | always | active | shot_director_step.py |
|
| 17 | scene_cinematography |
촬영 감독 (레거시) | gemini-pro |
transform | on_demand | deprecated | director_steps.py |
|
| 17.05 | scene_camera_flow |
씬 카메라 플로우 | gpt |
transform | always | active | scene_camera_flow_step.py |
|
| 17.1 | shot_cinematography |
Shot별 촬영 기법 (deprecated) | gemini-pro |
transform | disabled | ✓ | deprecated | shot_cinematography_step.py |
| 18 | scene_dependency |
씬 연관 분석 (레거시 — disabled) | gpt |
transform | disabled | deprecated | director_steps.py |
|
| 18.1 | shot_dependency |
Shot 연관 분석 (병렬) | gpt |
transform | always | ✓ | active | shot_dependency_step.py |
| 19 | outlook_phase1 |
아웃룩 목록 추출 | gemini-pro |
transform | always | active | outlook_steps.py |
|
| 19.1 | outlook_phase2 |
아웃룩 씬별 매핑 | gemini-pro |
transform | always | active | outlook_steps.py |
|
| 19.2 | outlook_phase3 |
아웃룩 병합 정리 | gemini-pro |
transform | always | active | outlook_steps.py |
|
| 19.3 | outlook_extraction |
아웃룩 추출 (레거시) | gemini-pro |
transform | on_demand | deprecated | outlook_steps.py |
|
| 19.5 | shot_staging |
촬영 연출 (DP) | gpt |
transform | always | active | shot_staging_step.py |
|
| 19.51 | background_classify |
배경 그룹 분류 | gpt |
transform | if_background_mode | active | background_classify_step.py |
|
| 19.52 | background_master_plan |
배경 마스터플랜 | gpt |
transform | if_background_mode | active | background_master_plan_step.py |
|
| 19.55 | background_planner |
배경 생성 Planner (deprecated, Phase 7로 대체) | gpt |
transform | disabled | deprecated | background_planner_step.py |
|
| 19.6 | background_chain_planning |
배경 chain 플래닝 (deprecated, Phase 7로 대체) | gpt |
transform | disabled | deprecated | background_chain_planning_step.py |
|
| 19.61 | floor_plan_prompt |
도면 t2i 프롬프트 | gpt |
transform | if_background_mode | active | floor_plan_prompt_step.py |
|
| 19.7 | shot_essence_extraction |
샷 essence 추출 | gpt |
transform | if_shot_essence_enabled | active | shot_essence_extraction_step.py |
|
| 19.9 | scene_consistency |
씬 시각적 일관성 | gemini-pro |
transform | always | active | scene_consistency_step.py |
|
| 21 | scene_verify |
교차 검증 (레거시) | gpt |
editorial | disabled | ✓ | deprecated | detail_steps.py |
| 21.5 | location_floor_plan |
위치 도면 생성 (deprecated, Phase 7로 대체) | gpt |
asset | disabled | deprecated | location_floor_plan_step.py |
|
| 21.55 | floor_plan_render |
도면 이미지 생성 | gpt |
asset | if_background_mode | active | floor_plan_render_step.py |
|
| 21.56 | floor_plan_light_sidecar |
도면 단순화 사이드카 (W21B-w5) | gpt |
asset | if_background_mode | active | floor_plan_light_sidecar_step.py |
|
| 21.57 | floor_plan_overlay_payload |
도면 오버레이 페이로드 | gpt |
transform | if_background_mode | active | floor_plan_overlay_payload_step.py |
|
| 21.58 | base_location_dossier |
기초 위치 정보 (W20A) | gpt |
transform | if_background_mode | active | base_location_dossier_step.py |
|
| 21.59 | floor_plan_geometry_readback |
도면 기하 readback (W20A2) | gpt |
transform | if_background_mode | active | floor_plan_geometry_readback_step.py |
|
| 21.591 | floor_plan_semantic_readback |
도면 마커 의미 fidelity readback (W21B-w4) | gpt |
transform | if_background_mode | active | floor_plan_semantic_readback_step.py |
|
| 21.593 | shot_projection_card |
샷 projection card — 카메라 가시물 서술 SOT (W21B-w4) | gpt |
transform | if_background_mode | active | shot_projection_card_step.py |
|
| 21.594 | bg_space_partition |
BG 공간분할 — plate group / anchor / ref DAG SOT (W21B-w5) | gpt |
transform | if_background_mode | active | bg_space_partition_step.py |
|
| 21.5945 | dwelling_zone_map |
dwelling zone map — FP+VLM 공간 묶기 (W21B) | gpt |
transform | if_background_mode | active | dwelling_zone_map_step.py |
|
| 21.595 | shot_aware_bg_render_plan |
shot-aware BG render plan (W20B) | gpt |
transform | if_background_mode | active | shot_aware_bg_render_plan_step.py |
|
| 21.6 | background_prompt |
배경 t2i 프롬프트 | gpt |
transform | if_background_mode | active | background_prompt_step.py |
|
| 21.65 | episode_reference_policy |
에피소드 참조 정책 | gpt |
transform | always | active | episode_reference_policy_step.py |
|
| 21.66 | visual_continuity_anchor |
시각 연속성 anchor (W21B-W7) | gpt |
transform | if_visual_continuity_anchor_enabled | active | visual_continuity_anchor_step.py |
|
| 21.7 | scene_detail |
씬 상세 분석 (병렬) | gemini-pro |
transform | always | ✓ | active | detail_steps.py |
| 21.71 | shot_dependency_t2i |
Shot 연관 재계산 (LLM) | gpt-mini |
transform | always | active | shot_dependency_t2i_step.py |
|
| 21.72 | t2i_review |
T2I 프롬프트 검수 | gpt |
editorial | always | active | t2i_review_step.py |
|
| 21.73 | zoom_continuity_anchor |
zoom continuity anchor (W21B-W7 W-C1) | gpt |
transform | if_zoom_continuity_anchor_enabled | active | zoom_continuity_anchor_step.py |
|
| 21.76 | outdoor_site_layout |
야외 site layout 좌표 SOT (W21B-W8) | gpt |
transform | if_outdoor_site_layout_enabled | active | outdoor_site_layout_step.py |
|
| 21.77 | outdoor_place_spec |
야외 장소 마커 스펙 (W22 직행 ①) | gpt |
transform | if_outdoor_direct_or_map_or_lane | active | outdoor_place_spec_step.py |
|
| 21.775 | outdoor_lane_plan |
야외 3레인 lane plan (설계 v2 ①) | gpt |
transform | if_outdoor_lane_plan | active | outdoor_lane_plan_step.py |
|
| 21.78 | outdoor_place_canon |
장소 캐논 자산 (W22 직행 ②) | gpt |
asset | if_outdoor_direct_or_map_or_lane | active | outdoor_place_canon_step.py |
|
| 21.78 | outdoor_frame_mode |
레인2 구도 판정 (E2E6 ③) | gpt |
transform | if_outdoor_frame_mode | active | outdoor_frame_mode_step.py |
|
| 21.79 | outdoor_shot_grounding |
야외 샷 grounding (W22 직행 ③) | gpt |
transform | if_outdoor_direct_compose | active | outdoor_shot_grounding_step.py |
|
| 21.9 | shot_ref_classify |
샷 참조 분류 (레시피) | gpt |
transform | if_still_recipe | active | shot_ref_classify_step.py |
|
| 21.905 | background_share_plan |
배경 공유 계획 (전체 지휘) | gpt |
transform | if_background_share_plan | active | background_share_plan_step.py |
|
| 21.91 | shot_continuity |
샷 연속성 저작 (레시피) | gpt |
transform | if_still_recipe | active | shot_continuity_step.py |
|
| 21.915 | outdoor_structure_form_reference |
야외 구조물 형태 참조 검색·선택 (Stage D 선행) | gpt |
generate | if_outdoor_lane_pipe | active | outdoor_structure_form_reference_step.py |
|
| 21.92 | outdoor_structure_seed |
야외 레인2 구조물 seed (Stage D) | gemini-image |
generate | if_outdoor_lane_pipe | active | outdoor_structure_seed_step.py |
|
| 22 | world_guide |
월드 가이드 | gpt |
asset | always | active | image_steps.py |
|
| 22.5 | space_set_bg |
space set BG — frame/addon/life 3층 공간 세트 (W21B) | gpt |
asset | if_background_mode | active | space_set_bg_step.py |
|
| 23 | ref_image_gen |
요소 참조 이미지 | gemini-image |
asset | always | ✓ | active | image_steps.py |
| 24 | composite_image_gen |
인물+아웃룩 합성 이미지 | gemini-image |
asset | if_has_outlooks | ✓ | active | image_steps.py |
| 24.5 | character_state_variant |
인물 상태 변형 참조 이미지 | gemini-image |
asset | always | active | image_steps.py |
|
| 24.7 | background_chain_render |
배경 chain 렌더 (deprecated, Phase 7로 대체) | gpt |
asset | disabled | deprecated | background_chain_render_step.py |
|
| 24.72 | background_render |
배경 이미지 생성 | gpt |
asset | if_background_mode | active | background_render_step.py |
|
| 24.73 | shot_conti_light |
경량 콘티 (레시피) | gpt-image-2 |
asset | if_still_recipe | active | shot_conti_light_step.py |
|
| 25 | scene_image_pipeline |
씬 이미지 생성 (compound) | mixed |
asset | always | ✓ | active | image_steps.py |
| 100 | outlook_dedup |
아웃룩 중복 판별 | gpt |
transform | on_demand | active | outlook_steps.py |
|
| 101 | project_summary |
프로젝트 요약 (미구현) | gpt |
transform | disabled | removed | |
lifecycle 이 active 가 아닌 스텝이다. 삭제하지 않는
것이 규칙이라 코드에 남아 있고, 매니페스트가 상태를 들고 있다. 새 경로를
읽을 때 이 목록에 있는 스텝은 건너뛰어야 한다.
| order | step_id | 이름 | 상태 | 대체 |
|---|---|---|---|---|
| 5 | scene_split | 큰 씬 분할 (레거시) | deprecated | beat_extract,shot_extract |
| 17 | scene_cinematography | 촬영 감독 (레거시) | deprecated | shot_staging |
| 17.1 | shot_cinematography | Shot별 촬영 기법 (deprecated) | deprecated | shot_staging |
| 18 | scene_dependency | 씬 연관 분석 (레거시 — disabled) | deprecated | shot_dependency |
| 19.3 | outlook_extraction | 아웃룩 추출 (레거시) | deprecated | outlook_phase1,outlook_phase2,outlook_phase3 |
| 19.55 | background_planner | 배경 생성 Planner (deprecated, Phase 7로 대체) | deprecated | — |
| 19.6 | background_chain_planning | 배경 chain 플래닝 (deprecated, Phase 7로 대체) | deprecated | — |
| 21 | scene_verify | 교차 검증 (레거시) | deprecated | — |
| 21.5 | location_floor_plan | 위치 도면 생성 (deprecated, Phase 7로 대체) | deprecated | — |
| 24.7 | background_chain_render | 배경 chain 렌더 (deprecated, Phase 7로 대체) | deprecated | — |
| 101 | project_summary | 프로젝트 요약 (미구현) | removed | — |
스텝 11개 — 상세
scene_split
gemini-flash
Step 5: 큰 씬 분할 (조건부).
backend/app/core/steps/scene_steps.py
84줄scene_segmentationtext_cleanup v1.202603231200·1판·1절 모듈 수준 추정scene_cinematography
gemini-pro
촬영 감독 -- 전체 씬 일괄로 촬영 기법 N가지 선택.
backend/app/core/steps/director_steps.py
90줄scene_directorscene_cinematography v2.202603261200·2판·2절shot_cinematography
gemini-pro
Shot별 촬영 기법 2개 선정.
backend/app/core/steps/shot_cinematography_step.py
141줄shot_selection scene_directorshot_cinematography v1.202603281644·1판·2절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절scene_dependency
gpt
씬 연관 분석 v2 -- 배경 중심 + 인물 중심 분리.
backend/app/core/steps/director_steps.py
45줄scene_directorscene_director v10.202608070006·5판·1절outlook_extraction
gemini-pro
Legacy: outlook_extraction → phase1+2+3 순차 실행.
backend/app/core/steps/outlook_steps.py
38줄scene_directorentity_relation v3.202605181858·3판·2절 scene_director v10.202608070006·5판·1절 scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절 모듈 수준 추정background_planner
gpt
단일 LLM 호출로 episode 단위 배경 생성 플랜을 결정.
backend/app/core/steps/background_planner_step.py
183줄shot_validator shot_selection scene_director entity_merge entity_detail visual_world_rulesscene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절background_chain_planning
gpt
Step: location별 배경 이미지 chain 트리 설계.
backend/app/core/steps/background_chain_planning_step.py
190줄shot_validator shot_selection shot_staging scene_director entity_merge entity_detail visual_world_rulesbackground_planner v3.202604291500·3판·2절 location_floor_plan v4.202605201000·4판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_staging v22.202608130110·17판·1절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절scene_verify
gpt
Step 17: 교차 검증 (앞2씬 컨텍스트). 조건부: 다중 캐릭터 씬만.
backend/app/core/steps/detail_steps.py
95줄scene_detailscene_detail v42.202608121750·37판·1절 scene_verify v2.202605181937·2판·1절location_floor_plan
gpt
planner-driven sequential 도면 PNG 생성 + DB 등록.
backend/app/core/steps/location_floor_plan_step.py
666줄shot_validator shot_selection scene_save entity_merge visual_world_rules scene_director background_plannerbackground_planner v3.202604291500·3판·2절 location_floor_plan v4.202605201000·4판·2절 scene_director v10.202608070006·5판·1절 shot_extract v17.202607222348·9판·2절 shot_selection v7.202607222349·6판·2절 visual_world_rules v10.202607080130·10판·1절background_chain_render
gpt
Step: chain plan → 노드별 배경 PNG (gpt-image-2) + DB 등록.
backend/app/core/steps/background_chain_render_step.py
653줄background_chain_planning location_floor_planbackground_chain_planning v5.202605200932·5판·2절 background_planner v3.202604291500·3판·2절 location_floor_plan v4.202605201000·4판·2절 shot_validator v7.202608071300·7판·1절project_summary
gpt
—
episode_summary