전체 파이프라인 — 개발자 상세도

2026-08-21 16:58 KST 생성 · 매니페스트 84스텝 · 스텝 클래스 85개 · 프롬프트 팩 89개를 코드에서 직접 읽어 생성했다. 문서와 코드가 어긋나면 코드가 맞다.

시나리오 텍스트 한 편이 들어와 씬별 최종 이미지가 나오기까지 파이프라인은 84개 스텝(활성 73 · 폐기 10)으로 구성된다. 각 스텝은 체크포인트를 남기고, 다음 스텝은 그 체크포인트만 읽는다 — 그래서 중간부터 재개할 수 있고, 어디서 잘못됐는지 되짚을 수 있다.

84전체 스텝
73활성
13이미지 계열
11병렬 fan-out
47OpenAI
23Gemini
89프롬프트 팩

구간 흐름

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 합산 이미지 검증, 비교 선택, 앵글 추천, 실내/실외 판정 한쪽 심판이 평균을 지배하는 문제가 실측돼 이중 판정으로 갔다.

이 문서를 읽는 법

시나리오 원문 한 편이 들어와 씬 단위로 쪼개져 저장되기까지의 구간이다. 이 구간의 산출이 뒤의 모든 것의 근거가 되므로, 여기서 잘리거나 뭉개지면 하류 전체가 조용히 빈약해진다.
절대 규칙 — 자르지 않는다. 시나리오 전문을 한 번에 전달한다. 청킹·[: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개 — 상세

0 기획서 분석 planning_doc_analysis gemini-lite
if_planning_doc

기획서를 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줄
선행없음
계약 type=transform · schema v1 · provider=gemini
1 텍스트 정리 text_cleanup gemini-lite

Step 1: PDF → Gemini Flash Lite로 텍스트 추출.

구현backend/app/core/steps/text_steps.py 44줄
선행없음
프롬프트 팩text_cleanup v1.202603231200
CP 산출cleaned_length cleaned_text original_length
적용 1 · 완료 1 · 실패 0 해석 모델 gemini-lite
계약 type=transform · schema v1 · provider=gemini
2 씬 세그먼테이션 scene_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_cleanup
프롬프트 팩text_cleanup v1.202603231200·1판·1절 모듈 수준 추정
CP 산출segments total_scenes
적용 1 · 완료 1 · 실패 0 해석 모델 gemini-flash
계약 type=transform · schema v2 · provider=gemini
3 에피소드 요약 episode_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절 모듈 수준 추정
CP 산출key_events summary
적용 1 · 완료 1 · 실패 0 해석 모델 gpt-mini
계약 type=transform · schema v1 · provider=gemini
4 시각적 세계관 규칙 visual_world_rules gpt

Step 4: 시각적 세계관 규칙 추출.

구현 주석 전문
입력:
        - text_cleanup 체크포인트 (정리된 텍스트)
        - episode_summary 체크포인트 (에피소드 요약)

    출력:
        - rules: 시각적 규칙 목록
        - era: 시대 배경
        - region: 지역/국가 배경
구현backend/app/core/steps/summary_steps.py 57줄
선행episode_summary
프롬프트 팩episode_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출director_notes era region rules source_language t2i_context
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
6 씬 저장 scene_save -

Step 6: 씬 저장 (DB + checkpoint). LLM 호출 없음.

구현 주석 전문
scene_segmentation 결과(오프셋)를 받아 fulltext를 슬라이스하여
    각 segment에 text 필드를 추가한다.
    이후 downstream 스텝은 seg["text"]만 사용하고 fulltext 로딩 불필요.
구현backend/app/core/steps/scene_steps.py 37줄
선행scene_segmentation
프롬프트 팩text_cleanup v1.202603231200·1판·1절 모듈 수준 추정
CP 산출segments total_scenes
적용 113 · 완료 113 · 실패 0 해석 모델 -
계약 type=transform · schema v1 · provider=-
7 씬별 요약 (병렬) scene_summary gpt-mini
병렬 fan-out

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_rules
프롬프트 팩episode_summary v1.202603231200·1판·1절 scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출summaries
적용 113 · 완료 113 · 실패 0 해석 모델 gpt-mini
계약 type=transform · schema v1 · provider=gemini
v4 파이프라인의 계층 축이다. 씬 → beat(상태 변화) → shot(스틸컷) → 선택된 shot 으로 내려간다. DB 의 scene_still 한 행이 곧 1 shot 이고 scene_index 로 씬에 묶인다.
모델 배정 근거(2026-07-11 4회차 전수 비교). beat·shot 추출은 Gemini Pro 다. Sol 은 회수율이 높은 대신 beat/shot 을 +160% 과세분하고 핵심 배정에 결함이 있었다. 반대로 엔티티 후보 발굴은 Sol 이 낫다 — 그래서 인물 추출만 Sol 로 되돌렸다.
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개 — 상세

7.1 Beat 추출 (병렬) beat_extract gemini-pro
병렬 fan-out

Beat 추출 — 원본 씬에서 인물 상태 변화 최소 단위 추출.

구현backend/app/core/steps/beat_shot_steps.py 194줄
선행scene_save visual_world_rules entity_character_list
프롬프트 팩beat_extract v3.202603301500·3판·2절 visual_world_rules v10.202607080130·10판·1절
CP 산출scenes total_beats
적용 113 · 완료 113 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
7.2 Shot 추출 (순차) shot_extract gemini-pro
병렬 fan-out

Shot 추출 — beat 기반으로 씬별 스틸컷 추출.

구현backend/app/core/steps/beat_shot_steps.py 298줄
선행beat_extract visual_world_rules entity_character_list
프롬프트 팩beat_extract v3.202603301500·3판·2절 shot_extract v17.202607222348·9판·2절 visual_world_rules v10.202607080130·10판·1절
CP 산출scenes total_shots
적용 113 · 완료 113 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
7.25 Shot 검증 shot_validator gemini-pro
병렬 fan-out

각 shot description을 '한 찰나' 원칙에 맞게 검증·재작성.

구현backend/app/core/steps/shot_validator_step.py 427줄
선행shot_extract
프롬프트 팩scene_director v10.202608070006·5판·1절 shot_extract v17.202607222348·9판·2절 shot_validator v7.202608071300·7판·1절
CP 산출changed_shots scenes total_shots
적용 113 · 완료 113 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
15.5 중요 샷 선택 (병렬) shot_selection gpt-mini
병렬 fan-out

중요 샷 선택 — 씬별 2중 캡 (절대 + 비율).

구현backend/app/core/steps/shot_selection_step.py 283줄
선행shot_validator
프롬프트 팩shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절
CP 산출max_per_scene scenes total_selected total_shots
적용 113 · 완료 113 · 실패 0 해석 모델 gpt-mini
계약 type=transform · schema v1 · provider=gemini
인물 → 배경 → 소품 3단계를 각각 별도 스텝으로 분리했다. 리스팅(후보 회수)과 추출(상세 확정)이 또 나뉘어 있어, 회수율이 좋은 모델과 확정이 정확한 모델을 따로 쓸 수 있다.
GPT 엔티티 출력은 후보 발굴용이다 — SOT 직승격 금지. dedupe 게이트가 후속 과제로 남아 있다. entity_merge 가 중복을 병합하고 entity_filter 가 저빈도(3씬 이하) 요소를 LLM 으로 걸러낸다.
요소의 변형은 같은 엔티티를 덮어쓰지 않고 별도 EntityCanon 으로 두고 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개 — 상세

6.5 인물 리스트 (사전 추출) 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_rules
프롬프트 팩entity_character_list v2.202605011057·2판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출characters
적용 30 · 완료 30 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
8 인물 리스팅 entity_all_character gpt

인물 리스팅 — shot 기반 1회 호출 (fallback: 씬 체이닝).

구현backend/app/core/steps/entity_steps.py 30줄
선행scene_save visual_world_rules shot_validator
프롬프트 팩shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출characters
적용 37 · 완료 37 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
9 인물 추출 entity_extract_character gpt

Step 8: 인물 추출 — entity_all_character 리스트 기반으로 상세 설명 추가.

구현backend/app/core/steps/entity_steps.py 19줄
선행entity_all_character
프롬프트 팩visual_world_rules v10.202607080130·10판·1절
CP 산출characters
적용 37 · 완료 37 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
10 배경 리스팅 entity_all_location gpt

배경 리스팅 — shot 기반 1회 호출.

구현backend/app/core/steps/entity_steps.py 23줄
선행scene_save visual_world_rules shot_validator
프롬프트 팩shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출locations
적용 56 · 완료 56 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
11 배경 추출 entity_extract_location gemini-pro

Step 9: 배경 추출 — entity_all_location 리스트 기반으로 상세 설명 추가.

구현backend/app/core/steps/entity_steps.py 19줄
선행entity_all_location
프롬프트 팩visual_world_rules v10.202607080130·10판·1절
CP 산출locations
적용 56 · 완료 56 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
12 소품 리스팅 entity_all_prop gpt

소품 리스팅 — shot 기반 1회 호출.

구현backend/app/core/steps/entity_steps.py 23줄
선행scene_save visual_world_rules shot_validator
프롬프트 팩shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출props
적용 27 · 완료 27 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
13 소품 추출 entity_extract_prop gemini-pro

Step 10: 소품 추출 — entity_all_prop 리스트 기반으로 상세 설명 추가.

구현backend/app/core/steps/entity_steps.py 19줄
선행entity_all_prop
프롬프트 팩visual_world_rules v10.202607080130·10판·1절
CP 산출props
적용 27 · 완료 27 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
13.5 요소 중복 병합 entity_merge gpt

요소 중복 병합 — 타입 간 중복/유사 요소를 LLM으로 판별하여 제거.

구현backend/app/core/steps/entity_steps.py 103줄
선행entity_extract_character entity_extract_location entity_extract_prop scene_summary visual_world_rules
프롬프트 팩scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출characters locations props removed
적용 120 · 완료 120 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
13.6 요소 변형 관계 추출 entity_relation gpt

Step 13.6: 요소 변형 관계 추출.

구현 주석 전문
entity_merge 결과에서 같은 대상의 변형 쌍을 식별하고
    시각적 유사성 여부를 판단하여 RelationFact에 기록.
구현backend/app/core/steps/entity_relation_step.py 85줄
선행entity_merge
프롬프트 팩beat_extract v3.202603301500·3판·2절 shot_validator v7.202608071300·7판·1절
CP 산출candidates_checked relations relations_found visual_similar_count
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
13.7 저빈도 요소 필터링 entity_filter gpt-mini

Step 11: 저빈도 요소 필터링 (3씬 이하 -> LLM 판단).

구현backend/app/core/steps/entity_steps.py 68줄
선행entity_relation
프롬프트 팩entity_relation v3.202605181858·3판·2절
CP 산출decisions filtered_entities kept_count removed_count
적용 1 · 완료 1 · 실패 0 해석 모델 gpt-mini
계약 type=transform · schema v1 · provider=gemini
14 요소 상세 + enum entity_detail gpt

Step 10: 요소 상세 — 시각적 상세 정보 + short_id 확정.

구현backend/app/core/steps/entity_steps.py 146줄
선행entity_filter
프롬프트 팩entity_extractor_v2 v14.202606181515·11판·8절 entity_filter v3.202605201316·3판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출entity_details entity_queue
적용 106 · 완료 106 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
15 요소 T2I 프롬프트 (병렬) entity_t2i gemini-pro
병렬 fan-out

Step 11: T2I 프롬프트 병렬 생성.

구현backend/app/core/steps/entity_steps.py 299줄
선행entity_detail
프롬프트 팩visual_world_rules v10.202607080130·10판·1절
CP 산출characters completed locations props
적용 106 · 완료 106 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v3 · provider=gemini
누가 화면에 있고, 무엇을 입고 있고, 카메라가 어디서 보는지를 확정하는 구간이다.
visible_entities(VE)는 LLM 이 만들지 않는다. scene_director 가 확정한 데이터에서 코드가 자동 구축한다. 그리고 하류 T2I 프롬프트가 VE 밖 엔티티를 쓰면 retry 후 강제 제거된다 — 이것이 "씬에 배정된 인물 전체를 한 컷에 다 넣지 않는다"를 강제하는 층이다.
아웃룩은 3단계다 — 목록 추출(phase1) → 씬별 매핑(phase2) → 병합 정리(phase3). 의상은 인물과 별도 축이라 T2I 에서 복합 ID(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개 — 상세

16 씬 감독 (물리적 존재) scene_director gemini-pro

Step 12: 씬 감독 (V/A/H 3분류).

구현backend/app/core/steps/director_steps.py 115줄
선행scene_save entity_t2i
프롬프트 팩shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절 visual_world_rules v10.202607080130·10판·1절
CP 산출scene_present_characters scene_present_entities scenes
적용 113 · 완료 109 · 실패 4 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
16.5 Shot별 VE 판정 shot_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_validator
프롬프트 팩entity_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절
CP 산출llm_called_scenes prompt_version scenes schema_version skipped_scenes total_shots
적용 113 · 완료 113 · 실패 0 해석 모델 gpt
계약 type=transform · schema v3 · provider=openai
17.05 씬 카메라 플로우 scene_camera_flow gpt
resume 민감

씬 단위 카메라 연속 흐름 설계 — 선택된 샷을 플로우 위에 배정.

구현backend/app/core/steps/scene_camera_flow_step.py 250줄
선행shot_validator shot_selection scene_director entity_merge scene_save
프롬프트 팩scene_camera_flow v5.202608130110·5판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절
CP 산출scenes
적용 113 · 완료 113 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
18.1 Shot 연관 분석 (병렬) shot_dependency gpt
병렬 fan-out

Shot 연관 분석 — 배경 기준 + 엔티티 오버랩 스코어링.

구현backend/app/core/steps/shot_dependency_step.py 163줄
선행shot_selection scene_director
프롬프트 팩scene_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절
CP 산출dependencies
적용 255 · 완료 255 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
19 아웃룩 목록 추출 outlook_phase1 gemini-pro

아웃룩 Phase1 — 캐릭터별 아웃룩 목록 추출 + orphan retry.

구현backend/app/core/steps/outlook_steps.py 138줄
선행scene_director
프롬프트 팩entity_relation v3.202605181858·3판·2절
CP 산출null_outlook_chars outlooks
적용 35 · 완료 35 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
19.1 아웃룩 씬별 매핑 outlook_phase2 gemini-pro

아웃룩 Phase2 — 씬별 캐릭터→아웃룩 매핑 + 누락 retry.

구현backend/app/core/steps/outlook_steps.py 129줄
선행outlook_phase1
프롬프트 팩entity_relation v3.202605181858·3판·2절 scene_director v10.202608070006·5판·1절 scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절 모듈 수준 추정
CP 산출null_outlook_chars outlooks scene_assignments
적용 113 · 완료 114 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
19.2 아웃룩 병합 정리 outlook_phase3 gemini-pro

아웃룩 Phase3 — LLM 병합 판별 + 코드에서 정리.

구현backend/app/core/steps/outlook_steps.py 82줄
선행outlook_phase2
프롬프트 팩scene_summary v1.202603231200·1판·1절
CP 산출null_outlook_chars outlooks removed scene_assignments
적용 1 · 완료 35 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v1 · provider=gemini
19.5 촬영 연출 (DP) shot_staging gpt
resume 민감

샷별 창의적 촬영 연출 + 배경 핵심 요소 분석.

구현backend/app/core/steps/shot_staging_step.py 60줄
선행shot_validator shot_selection visual_world_rules entity_merge scene_camera_flow
프롬프트 팩scene_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절
CP 산출failed_batches shots total
적용 255 · 완료 255 · 실패 0 해석 모델 gpt
계약 type=transform · schema v6 · provider=openai
19.7 샷 essence 추출 shot_essence_extraction gpt
if_shot_essence_enabled

Shot별 essence/peripheral/atmospheric 3분류 추출.

구현backend/app/core/steps/shot_essence_extraction_step.py 263줄
선행shot_validator shot_selection
프롬프트 팩shot_essence_extraction v4.202605201351·4판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절
계약 type=transform · schema v1 · provider=openai
19.9 씬 시각적 일관성 scene_consistency gemini-pro
resume 민감

씬 내 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_rules
프롬프트 팩beat_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절
CP 산출scenes
적용 113 · 완료 113 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v3 · provider=gemini
100 아웃룩 중복 판별 outlook_dedup gpt
on_demand

아웃룩 중복 판별 — 기존 outlook_dedup 로직 재사용.

구현backend/app/core/steps/outlook_steps.py 47줄
선행outlook_phase3
프롬프트 팩entity_relation v3.202605181858·3판·2절 scene_director v10.202608070006·5판·1절 scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절 모듈 수준 추정
계약 type=transform · schema v— · provider=openai
배경을 샷마다 새로 상상하지 않게 만드는 구간이다. 장소를 그룹으로 묶고(background_classify), 도면을 그리고, 그 도면에서 카메라가 무엇을 볼 수 있는지를 기계적으로 되읽는다.
readback 이 두 겹인 이유. floor_plan_geometry_readback 은 좌표·기하를, floor_plan_semantic_readback 은 마커가 의미대로 그려졌는지를 따로 확인한다. 이미지 모델은 도면을 그리라고 하면 형태는 맞추고 라벨을 어긋나게 두는 일이 잦다.
도면 재개는 성공 항목만 재사용한다(2026-08-19). 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개 — 상세

19.51 배경 그룹 분류 background_classify gpt
if_background_mode

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_director
프롬프트 팩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절
CP 산출building_groups
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
19.52 배경 마스터플랜 background_master_plan gpt
if_background_mode

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_rules
프롬프트 팩background_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절
CP 산출background_catalog bg_catalog_hash diagnostics plans shot_background_map shot_binding_hash
적용 12 · 완료 12 · 실패 0 해석 모델 gpt
계약 type=transform · schema v5 · provider=openai
19.61 도면 t2i 프롬프트 floor_plan_prompt gpt
if_background_mode

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_rules
프롬프트 팩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절
CP 산출consumed_bg_catalog_hash consumed_shot_binding_hash floor_plans
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=transform · schema v2 · provider=openai
21.55 도면 이미지 생성 floor_plan_render gpt
if_background_mode

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_plan
프롬프트 팩background_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절
CP 산출floor_plans
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=asset · schema v1 · provider=openai
21.56 도면 단순화 사이드카 (W21B-w5) floor_plan_light_sidecar gpt
if_background_mode

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_prompt
프롬프트 팩floor_plan_prompt v11.202607170145·11판·2절
CP 산출data 없음(자산만 남김)
적용 0 · 완료 0 · 실패 0 해석 모델 gpt
계약 type=asset · schema v2 · provider=openai
21.57 도면 오버레이 페이로드 floor_plan_overlay_payload gpt
if_background_mode

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_plan
프롬프트 팩background_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절
CP 산출overlays
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.58 기초 위치 정보 (W20A) base_location_dossier gpt
if_background_mode

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_payload
프롬프트 팩background_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절
CP 산출dossiers
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=transform · schema v2 · provider=openai
21.59 도면 기하 readback (W20A2) floor_plan_geometry_readback gpt
if_background_mode

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_render
CP 산출image_api_call_count llm_call_count per_fp real_vlm_call_count
적용 1 · 완료 17 · 실패 0 해석 모델 gpt
계약 type=transform · schema v2 · provider=openai
21.591 도면 마커 의미 fidelity readback (W21B-w4) floor_plan_semantic_readback gpt
if_background_mode

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_render
CP 산출data 없음(자산만 남김)
적용 0 · 완료 0 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.593 샷 projection card — 카메라 가시물 서술 SOT (W21B-w4) shot_projection_card gpt
if_background_mode

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_save
프롬프트 팩background_master_plan v6.202605290248·6판·2절 floor_plan_prompt v11.202607170145·11판·2절 shot_staging v22.202608130110·17판·1절
CP 산출data 없음(자산만 남김)
적용 0 · 완료 0 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.594 BG 공간분할 — plate group / anchor / ref DAG SOT (W21B-w5) bg_space_partition gpt
if_background_mode

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_card
프롬프트 팩shot_projection_card v1.202605302212·1판·2절
CP 산출data 없음(자산만 남김)
적용 0 · 완료 0 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.5945 dwelling zone map — FP+VLM 공간 묶기 (W21B) dwelling_zone_map gpt
if_background_mode

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_card
프롬프트 팩background_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절
CP 산출data 없음(자산만 남김)
적용 0 · 완료 0 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.595 shot-aware BG render plan (W20B) shot_aware_bg_render_plan gpt
if_background_mode

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_staging
프롬프트 팩background_master_plan v6.202605290248·6판·2절 shot_projection_card v1.202605302212·1판·2절 shot_staging v22.202608130110·17판·1절
CP 산출llm_provider_attempts_per_fp per_fp real_api_call_counts shot_staging_index_diagnostics
적용 1 · 완료 17 · 실패 0 해석 모델 gpt
계약 type=transform · schema v10 · provider=openai
21.6 배경 t2i 프롬프트 background_prompt gpt
if_background_mode

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_rules
프롬프트 팩background_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절
CP 산출backgrounds consumed_bg_catalog_hash consumed_shot_binding_hash
적용 71 · 완료 71 · 실패 0 해석 모델 gpt
계약 type=transform · schema v3 · provider=openai
21.65 에피소드 참조 정책 episode_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_relation
프롬프트 팩shot_director v6.202605172247·6판·2절 shot_selection v7.202607222349·6판·2절
CP 산출policy schema_version
적용 106 · 완료 106 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.66 시각 연속성 anchor (W21B-W7) visual_continuity_anchor gpt
if_visual_continuity_anchor_enabled하류 소비

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_t2i
프롬프트 팩entity_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절
CP 산출diagnostics groups review_html schema_version
적용 4 · 완료 4 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
확정된 연출·배경 위에서 실제 이미지 프롬프트가 나오는 구간이다.
T2I 단일 스틸컷 원칙. 하나의 t2i_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개 — 상세

21.7 씬 상세 분석 (병렬) scene_detail gemini-pro
병렬 fan-out하류 소비

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_anchor
프롬프트 팩background_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절
CP 산출consumed_bg_catalog_hash consumed_shot_binding_hash scenes
적용 255 · 완료 255 · 실패 0 해석 모델 gemini-pro
계약 type=transform · schema v13 · provider=gemini
21.71 Shot 연관 재계산 (LLM) shot_dependency_t2i gpt-mini

T2I 기반 shot 연관 재계산 — LLM이 스토리 연관성으로 판단.

구현backend/app/core/steps/shot_dependency_t2i_step.py 229줄
선행scene_detail scene_consistency
프롬프트 팩scene_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절
CP 산출dependencies
적용 255 · 완료 255 · 실패 0 해석 모델 gpt-mini
계약 type=transform · schema v4 · provider=gemini
21.72 T2I 프롬프트 검수 t2i_review gpt
CP 수정: entity_t2i, scene_detail

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_detail
프롬프트 팩scene_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절
계약 type=editorial · schema v1 · provider=openai
21.73 zoom continuity anchor (W21B-W7 W-C1) zoom_continuity_anchor gpt
if_zoom_continuity_anchor_enabled

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_staging
프롬프트 팩scene_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절
CP 산출diagnostics groups review_html schema_version
적용 4 · 완료 4 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
이 문서의 나머지 구간이 "모든 장소"를 다룬다면, 여기는 야외에 서 있는 사람이 지은 구조물 하나를 확정 실사로 만드는 전용 계보다. 건물의 형태· 규모·재질·표시면이 샷마다 흔들리면 같은 장소로 읽히지 않기 때문에 별도 계보로 떨어져 있다.
권위를 쪼갠다 — 이 계보의 핵심 설계.
· 뼈대(형태) = 선 스케치 — 층수·개구부·계단 주행이 또렷하다
· 표면(재질·풍화·분위기) = 검색으로 회수한 실제 사진
· 표시면의 글자 = 작품의 것(참조의 상호는 절대 베끼지 않는다)
· 없는 정보 = 사전조사(typology prior)가 원본어 검색으로 메운다
한 장의 참조에 전부 맡기면 나쁜 참조의 구조가 그대로 전이된다 — 실측으로 확인된 결함이고, 권위 분리가 그것을 끊었다.
구현 상태. 아래 5스텝 계보 중 현재 코드에 있는 것은 outdoor_structure_form_referenceoutdoor_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
심판 점수 척도가 서로 달라(0~100 vs 0~10) 한쪽이 평균을 지배하던 결함이 실측돼 팩 v4 에서 척도를 맞췄다. 검색 질의는 원본어가 최고 점수 기준 3/3 우세였다(3그룹 A/B).

현행 — 구조물 씨드 (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
층수 병목의 진범은 judge 였다. 3롤 중 두 장이 요구대로 4층인데 3층짜리가 10점으로 뽑혔다 — 생성이 아니라 선택이 문제였고, 팩 v13 에서 계수 절차를 넣자 같은 이미지 재판정 2회 모두 뒤집혔다. 판정을 거친 산출은 "생성이 만든 것"이 아니라 "판정이 고른 것"이므로, 생성 탓을 하기 전에 탈락 후보부터 열어야 한다.

목표 — 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개 — 상세

21.76 야외 site layout 좌표 SOT (W21B-W8) outdoor_site_layout gpt
if_outdoor_site_layout_enabled

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_director
프롬프트 팩background_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절
CP 산출composition_guides diagnostics groups prompt_overrides review_html schema_version
적용 8 · 완료 8 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.77 야외 장소 마커 스펙 (W22 직행 ①) outdoor_place_spec gpt
if_outdoor_direct_or_map_or_lane

야외 장소 마커 스펙 (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_rules
프롬프트 팩background_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절
CP 산출groups
적용 32 · 완료 32 · 실패 0 해석 모델 gpt
계약 type=transform · schema v2 · provider=openai
21.775 야외 3레인 lane plan (설계 v2 ①) outdoor_lane_plan gpt
if_outdoor_lane_plan

야외 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_staging
프롬프트 팩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절
CP 산출groups
적용 32 · 완료 32 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.78 장소 캐논 자산 (W22 직행 ②) outdoor_place_canon gpt
if_outdoor_direct_or_map_or_lane

장소 캐논 자산 (W22 ②) — nb2 3롤→이중 판정→수정→gpt 재투영 맵.

구현backend/app/core/steps/outdoor_place_canon_step.py 417줄
선행outdoor_lane_plan outdoor_place_spec
프롬프트 팩floor_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절
CP 산출groups
적용 3 · 완료 3 · 실패 0 해석 모델 gpt
계약 type=asset · schema v1 · provider=openai
21.78 레인2 구도 판정 (E2E6 ③) outdoor_frame_mode gpt
if_outdoor_frame_mode

레인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_director
프롬프트 팩outdoor_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절
계약 type=transform · schema v1 · provider=openai
21.79 야외 샷 grounding (W22 직행 ③) outdoor_shot_grounding gpt
if_outdoor_direct_compose

샷 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_staging
프롬프트 팩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절
계약 type=transform · schema v1 · provider=openai
21.9 샷 참조 분류 (레시피) shot_ref_classify gpt
if_still_recipe

샷 참조 분류 — bgonly·prev v3·time_of_day (레시피 이식).

구현backend/app/core/steps/shot_ref_classify_step.py 133줄
선행shot_validator shot_selection scene_save scene_director
프롬프트 팩scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절
CP 산출scenes shots world_anchor_en
적용 255 · 완료 255 · 실패 0 해석 모델 gpt
계약 type=transform · schema v4 · provider=openai
21.905 배경 공유 계획 (전체 지휘) background_share_plan gpt
if_background_share_plan

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_director
프롬프트 팩background_share_plan v1.202607190212·1판·2절 scene_director v10.202608070006·5판·1절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절
CP 산출attempts plan shot_tags
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.91 샷 연속성 저작 (레시피) shot_continuity gpt
if_still_recipe

샷 연속성 저작 — pose_canon·pose_fix·carried (레시피 이식).

구현backend/app/core/steps/shot_continuity_step.py 134줄
선행shot_validator shot_selection scene_save entity_merge
프롬프트 팩shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절
CP 산출carried pose_canon pose_fix
적용 255 · 완료 255 · 실패 0 해석 모델 gpt
계약 type=transform · schema v1 · provider=openai
21.915 야외 구조물 형태 참조 검색·선택 (Stage D 선행) outdoor_structure_form_reference gpt
if_outdoor_lane_pipe

구조물마다 실사 형태 참조 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_rules
프롬프트 팩background_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절
CP 산출groups mandatory_group_ids target
적용 21 · 완료 21 · 실패 0 해석 모델 gpt
계약 type=generate · schema v5 · provider=openai
21.92 야외 레인2 구조물 seed (Stage D) outdoor_structure_seed gemini-image
if_outdoor_lane_pipe

레인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_director
프롬프트 팩background_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절
CP 산출groups
적용 21 · 완료 21 · 실패 0 해석 모델 gemini-image
계약 type=generate · schema v6 · provider=google
참조 이미지 → 합성 → 배경 → 콘티 → 최종 샷으로 내려가는 구간이다. 앞 단계 산출이 여기서 실제 그림이 된다.
계보(lineage)가 곧 일관성이다. 인물 참조를 만들고 (ref_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 로 변환하며, 선정 원본은 이전 샷 연속성 앵커로 보존한다.
수정 편집 참조 선별(2026-08-19). 기능을 켜면 결함 검사가 각 지적에 needs_ref_indices 를 구조 필드로 내고, 수정 호출은 요구된 참조만 붙인다. 선별 칸이 없는 지적이 하나라도 섞인 옛 기록은 안전하게 전부 첨부하며, 없는 엔티티를 새로 넣으라는 지적은 전용 지시 절을 더한다. 선별 여부와 누락은 records.jsonfix_ref_gate에 남는다.
Grok 발송 보호(2026-08-18~19). 프롬프트와 참조 라벨의 UTF-8 합계가 7,900B를 넘으면 샷 고유 재료가 아닌 일반 규칙 절만 순서대로 덜고, 실제 모델 상한 8,000B를 넘을 때만 발송 전에 막는다. HTTP 200 본문에 실린 429·5xx 오류도 제한 횟수 안에서 다시 보내되, 검열 거부는 비용만 반복되므로 이 재시도에서 제외한다.
검열된 시네마틱 변환은 원본으로 종결한다(2026-08-19). 같은 원본 지문에서 검열 거부가 설정 횟수에 닿으면 declined를 기록하고 원본을 최종본으로 확정한다. 다음 재개는 유료 변환을 다시 부르지 않으며, 원본 지문이 바뀌면 새 입력으로 다시 시도한다.
콘티는 러프해야 한다(2026-07-27 육안 지시). 세밀한 콘티를 주면 하류가 그 화풍을 물려받아 최종이 "만화 위 실사"가 된다. 러프 연필이라야 실사 배경 + 선화 인물이 깨끗하게 분리된다. 대신 러프할수록 방향 정보가 성기므로 방향 텍스트를 결정론으로 주입하는 것과 짝을 이룬다.
코드로 이미지에 그리지 않는다. PIL 마커·콘·텍스트 오버레이는 전면 금지다. 시각 요소는 항상 이미지 모델의 몫이고, 맵 위에 카메라·엔티티를 표시하는 단계는 i2i 로 작화한다.

구간 흐름 — 스텝 순서와 의존

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
최종 샷은 배경 · 콘티 · 인물 참조를 함께 받는다. 콘티가 세밀하면 그 화풍이 최종까지 전이되므로 러프 연필로 유지하고, 대신 방향은 텍스트로 결정론 주입한다. 맵 위 마커 표시가 필요하면 코드로 그리지 않고 i2i 로 작화한다.

스텝 8개 — 상세

22 월드 가이드 world_guide gpt

이미지 Phase StepRunner 서브클래스 — Steps 11-14.

구현 주석 전문
force 모드: 기존 이미지 삭제 안 함. 새 이미지 추가 생성 (is_primary 이동).
resume 모드: 미완성분만 이어서 생성.
구현backend/app/core/steps/image_steps.py 63줄
선행entity_t2i scene_detail
프롬프트 팩character_state_variant v1.202604101200·1판·1절 shot_staging v22.202608130110·17판·1절 still_recipe v22.202608180100·22판·5절 모듈 수준 추정
CP 산출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
적용 1 · 완료 1 · 실패 0 해석 모델 gpt
계약 type=asset · schema v1 · provider=openai
22.5 space set BG — frame/addon/life 3층 공간 세트 (W21B) space_set_bg gpt
if_background_mode

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_director
프롬프트 팩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절
계약 type=asset · schema v1 · provider=openai
23 요소 참조 이미지 ref_image_gen gemini-image
병렬 fan-out

이미지 Phase StepRunner 서브클래스 — Steps 11-14.

구현 주석 전문
force 모드: 기존 이미지 삭제 안 함. 새 이미지 추가 생성 (is_primary 이동).
resume 모드: 미완성분만 이어서 생성.
구현backend/app/core/steps/image_steps.py 113줄
선행entity_t2i
프롬프트 팩character_state_variant v1.202604101200·1판·1절 shot_staging v22.202608130110·17판·1절 still_recipe v22.202608180100·22판·5절 모듈 수준 추정
CP 산출failed generated low_freq_skipped outlook_generated outlook_skipped skipped skipped_composite_phase total
적용 141 · 완료 56 · 실패 0 해석 모델 gemini-image
계약 type=asset · schema v1 · provider=gemini
24 인물+아웃룩 합성 이미지 composite_image_gen gemini-image
병렬 fan-outif_has_outlooks

이미지 Phase StepRunner 서브클래스 — Steps 11-14.

구현 주석 전문
force 모드: 기존 이미지 삭제 안 함. 새 이미지 추가 생성 (is_primary 이동).
resume 모드: 미완성분만 이어서 생성.
구현backend/app/core/steps/image_steps.py 261줄
선행ref_image_gen outlook_phase3
프롬프트 팩character_state_variant v1.202604101200·1판·1절 shot_staging v22.202608130110·17판·1절 still_recipe v22.202608180100·22판·5절 모듈 수준 추정
CP 산출combo_total composite_done
적용 27 · 완료 27 · 실패 0 해석 모델 gemini-image
계약 type=asset · schema v1 · provider=gemini
24.5 인물 상태 변형 참조 이미지 character_state_variant gemini-image

죽은/다친 인물의 상태 variant 참조 이미지 생성.

구현backend/app/core/steps/image_steps.py 369줄
선행composite_image_gen shot_staging
프롬프트 팩character_state_variant v1.202604101200·1판·1절 shot_staging v22.202608130110·17판·1절
CP 산출state_variants
적용 9 · 완료 9 · 실패 0 해석 모델 gemini-image
계약 type=asset · schema v1 · provider=gemini
24.72 배경 이미지 생성 background_render gpt
if_background_mode

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 기준 relative
구현backend/app/core/steps/background_render_step.py 3742줄
선행floor_plan_overlay_payload background_prompt floor_plan_render background_master_plan
프롬프트 팩background_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절
CP 산출bg_reference_catalog consumed_bg_catalog_hash consumed_shot_binding_hash groups
적용 71 · 완료 71 · 실패 0 해석 모델 gpt
계약 type=asset · schema v3 · provider=openai
24.73 경량 콘티 (레시피) shot_conti_light gpt-image-2
if_still_recipe

경량 콘티 — 플레이트 느슨 참조 단일 프레임 (레시피 이식).

구현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_plan
프롬프트 팩background_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절
CP 산출conti_pack contis lane_conti map_conti
적용 95 · 완료 95 · 실패 0 해석 모델 gpt-image-2
계약 type=asset · schema v3 · provider=openai
25 씬 이미지 생성 (compound) scene_image_pipeline mixed
병렬 fan-out

이미지 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_plan
프롬프트 팩still_recipe v22.202608180100·22판·5절
CP 산출primary_count scene_total
적용 255 · 완료 253 · 실패 2 해석 모델 mixed
계약 type=asset · schema v1 · provider=mixed

스텝은 서로를 직접 부르지 않는다. 앞 스텝이 체크포인트에 남긴 것만 읽는다 — 그래서 중간부터 재개할 수 있고, 어느 스텝이 무엇을 망쳤는지 되짚을 수 있다. 이 탭은 그 계약을 설명한다.

체크포인트 manifest 필드

필드왜 있나
step_id · run_id스텝 식별자와 실행 회차 같은 스텝을 다시 돌렸을 때 어느 회차 산출인지 구분한다.
statuscompleted / failed / running running 인 채로 남으면 스테일 락이 된다. 아래 참조.
data이 스텝의 산출 본문 다음 스텝이 읽는 유일한 창구. 각 스텝 카드의 "CP 산출"이 실측 키다.
schema_versiondata 구조의 버전 구조가 바뀌면 올린다. 소비자가 구 CP 를 그대로 먹지 않게 막는다.
config_hash실질 입력의 지문 모델·팩·플래그가 바뀌면 값이 달라져 재실행 대상이 된다. 유효성 판정 장치가 아니다 — hash 가 달라도 실행은 되므로, 불가능한 조합은 별도 정책 SOT 가 실행 전에 거부한다.
resolved_modelalias 뒤의 실제 모델 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 …)

재개 · 락 · 재시도

재개는 CP 단위다. 완료된 스텝은 건너뛰고 실패·미실행 지점부터 이어 간다. 그래서 긴 실행이 중간에 죽어도 처음부터 다시 돌리지 않는다.
스테일 락은 force 로 뺏을 수 없다. 만료 판정은 started_at 기준 3600초이고, 회수는 resume 경로에서만 일어난다. 게다가 재시도가 started_at 을 갱신해 만료가 계속 미뤄진다(3577초 → 425초로 리셋된 실측이 있다). 대응은 두드리는 것이 아니라 3600초를 넘긴 뒤 resume 을 한 번 부르는 것이다.
부분 실패는 그룹 단위로 격리한다. 한 그룹이 실패해도 나머지는 진행하고, 실패는 failed_count 와 그룹 status 에 남는다. 다만 fail-closed 로 잠근 자리(형태 참조 결손 등)는 조용히 degrade 하지 않고 그 그룹을 세운다 — 조용한 하강이 사용자 지시를 아무도 모르게 어기기 때문이다.

병렬과 모델 alias

이 문서의 사실 출처

스텝 메타 = app/core/step_manifest.py · 구현/설명 = 스텝 클래스 docstring · 팩 = prompts/_base/ 디렉터리 · CP 산출 키 = 실제 실행 체크포인트 72개에서 실측(작품 식별자는 싣지 않는다). 빌더 = docs/architecture/_build_pipeline_doc.py.

매니페스트 전수 84행. order 순.

orderstep_id이름모델type 적용 조건병렬lifecycle구현 파일
0planning_doc_analysis 기획서 분석gemini-lite transform if_planning_doc active planning_doc_step.py
1text_cleanup 텍스트 정리gemini-lite transform always active text_steps.py
2scene_segmentation 씬 세그먼테이션gemini-flash transform always active scene_steps.py
3episode_summary 에피소드 요약gpt-mini transform always active summary_steps.py
4visual_world_rules 시각적 세계관 규칙gpt transform always active summary_steps.py
5scene_split 큰 씬 분할 (레거시)gemini-flash transform on_demand deprecated scene_steps.py
6scene_save 씬 저장- transform always active scene_steps.py
6.5entity_character_list 인물 리스트 (사전 추출)gpt transform always active character_list_step.py
7scene_summary 씬별 요약 (병렬)gpt-mini transform always active summary_steps.py
7.1beat_extract Beat 추출 (병렬)gemini-pro transform always active beat_shot_steps.py
7.2shot_extract Shot 추출 (순차)gemini-pro transform always active beat_shot_steps.py
7.25shot_validator Shot 검증gemini-pro transform always active shot_validator_step.py
8entity_all_character 인물 리스팅gpt transform always active entity_steps.py
9entity_extract_character 인물 추출gpt transform always active entity_steps.py
10entity_all_location 배경 리스팅gpt transform always active entity_steps.py
11entity_extract_location 배경 추출gemini-pro transform always active entity_steps.py
12entity_all_prop 소품 리스팅gpt transform always active entity_steps.py
13entity_extract_prop 소품 추출gemini-pro transform always active entity_steps.py
13.5entity_merge 요소 중복 병합gpt transform always active entity_steps.py
13.6entity_relation 요소 변형 관계 추출gpt transform always active entity_relation_step.py
13.7entity_filter 저빈도 요소 필터링gpt-mini transform always active entity_steps.py
14entity_detail 요소 상세 + enumgpt transform always active entity_steps.py
15entity_t2i 요소 T2I 프롬프트 (병렬)gemini-pro transform always active entity_steps.py
15.5shot_selection 중요 샷 선택 (병렬)gpt-mini transform always active shot_selection_step.py
16scene_director 씬 감독 (물리적 존재)gemini-pro transform always active director_steps.py
16.5shot_director Shot별 VE 판정gpt transform always active shot_director_step.py
17scene_cinematography 촬영 감독 (레거시)gemini-pro transform on_demand deprecated director_steps.py
17.05scene_camera_flow 씬 카메라 플로우gpt transform always active scene_camera_flow_step.py
17.1shot_cinematography Shot별 촬영 기법 (deprecated)gemini-pro transform disabled deprecated shot_cinematography_step.py
18scene_dependency 씬 연관 분석 (레거시 — disabled)gpt transform disabled deprecated director_steps.py
18.1shot_dependency Shot 연관 분석 (병렬)gpt transform always active shot_dependency_step.py
19outlook_phase1 아웃룩 목록 추출gemini-pro transform always active outlook_steps.py
19.1outlook_phase2 아웃룩 씬별 매핑gemini-pro transform always active outlook_steps.py
19.2outlook_phase3 아웃룩 병합 정리gemini-pro transform always active outlook_steps.py
19.3outlook_extraction 아웃룩 추출 (레거시)gemini-pro transform on_demand deprecated outlook_steps.py
19.5shot_staging 촬영 연출 (DP)gpt transform always active shot_staging_step.py
19.51background_classify 배경 그룹 분류gpt transform if_background_mode active background_classify_step.py
19.52background_master_plan 배경 마스터플랜gpt transform if_background_mode active background_master_plan_step.py
19.55background_planner 배경 생성 Planner (deprecated, Phase 7로 대체)gpt transform disabled deprecated background_planner_step.py
19.6background_chain_planning 배경 chain 플래닝 (deprecated, Phase 7로 대체)gpt transform disabled deprecated background_chain_planning_step.py
19.61floor_plan_prompt 도면 t2i 프롬프트gpt transform if_background_mode active floor_plan_prompt_step.py
19.7shot_essence_extraction 샷 essence 추출gpt transform if_shot_essence_enabled active shot_essence_extraction_step.py
19.9scene_consistency 씬 시각적 일관성gemini-pro transform always active scene_consistency_step.py
21scene_verify 교차 검증 (레거시)gpt editorial disabled deprecated detail_steps.py
21.5location_floor_plan 위치 도면 생성 (deprecated, Phase 7로 대체)gpt asset disabled deprecated location_floor_plan_step.py
21.55floor_plan_render 도면 이미지 생성gpt asset if_background_mode active floor_plan_render_step.py
21.56floor_plan_light_sidecar 도면 단순화 사이드카 (W21B-w5)gpt asset if_background_mode active floor_plan_light_sidecar_step.py
21.57floor_plan_overlay_payload 도면 오버레이 페이로드gpt transform if_background_mode active floor_plan_overlay_payload_step.py
21.58base_location_dossier 기초 위치 정보 (W20A)gpt transform if_background_mode active base_location_dossier_step.py
21.59floor_plan_geometry_readback 도면 기하 readback (W20A2)gpt transform if_background_mode active floor_plan_geometry_readback_step.py
21.591floor_plan_semantic_readback 도면 마커 의미 fidelity readback (W21B-w4)gpt transform if_background_mode active floor_plan_semantic_readback_step.py
21.593shot_projection_card 샷 projection card — 카메라 가시물 서술 SOT (W21B-w4)gpt transform if_background_mode active shot_projection_card_step.py
21.594bg_space_partition BG 공간분할 — plate group / anchor / ref DAG SOT (W21B-w5)gpt transform if_background_mode active bg_space_partition_step.py
21.5945dwelling_zone_map dwelling zone map — FP+VLM 공간 묶기 (W21B)gpt transform if_background_mode active dwelling_zone_map_step.py
21.595shot_aware_bg_render_plan shot-aware BG render plan (W20B)gpt transform if_background_mode active shot_aware_bg_render_plan_step.py
21.6background_prompt 배경 t2i 프롬프트gpt transform if_background_mode active background_prompt_step.py
21.65episode_reference_policy 에피소드 참조 정책gpt transform always active episode_reference_policy_step.py
21.66visual_continuity_anchor 시각 연속성 anchor (W21B-W7)gpt transform if_visual_continuity_anchor_enabled active visual_continuity_anchor_step.py
21.7scene_detail 씬 상세 분석 (병렬)gemini-pro transform always active detail_steps.py
21.71shot_dependency_t2i Shot 연관 재계산 (LLM)gpt-mini transform always active shot_dependency_t2i_step.py
21.72t2i_review T2I 프롬프트 검수gpt editorial always active t2i_review_step.py
21.73zoom_continuity_anchor zoom continuity anchor (W21B-W7 W-C1)gpt transform if_zoom_continuity_anchor_enabled active zoom_continuity_anchor_step.py
21.76outdoor_site_layout 야외 site layout 좌표 SOT (W21B-W8)gpt transform if_outdoor_site_layout_enabled active outdoor_site_layout_step.py
21.77outdoor_place_spec 야외 장소 마커 스펙 (W22 직행 ①)gpt transform if_outdoor_direct_or_map_or_lane active outdoor_place_spec_step.py
21.775outdoor_lane_plan 야외 3레인 lane plan (설계 v2 ①)gpt transform if_outdoor_lane_plan active outdoor_lane_plan_step.py
21.78outdoor_place_canon 장소 캐논 자산 (W22 직행 ②)gpt asset if_outdoor_direct_or_map_or_lane active outdoor_place_canon_step.py
21.78outdoor_frame_mode 레인2 구도 판정 (E2E6 ③)gpt transform if_outdoor_frame_mode active outdoor_frame_mode_step.py
21.79outdoor_shot_grounding 야외 샷 grounding (W22 직행 ③)gpt transform if_outdoor_direct_compose active outdoor_shot_grounding_step.py
21.9shot_ref_classify 샷 참조 분류 (레시피)gpt transform if_still_recipe active shot_ref_classify_step.py
21.905background_share_plan 배경 공유 계획 (전체 지휘)gpt transform if_background_share_plan active background_share_plan_step.py
21.91shot_continuity 샷 연속성 저작 (레시피)gpt transform if_still_recipe active shot_continuity_step.py
21.915outdoor_structure_form_reference 야외 구조물 형태 참조 검색·선택 (Stage D 선행)gpt generate if_outdoor_lane_pipe active outdoor_structure_form_reference_step.py
21.92outdoor_structure_seed 야외 레인2 구조물 seed (Stage D)gemini-image generate if_outdoor_lane_pipe active outdoor_structure_seed_step.py
22world_guide 월드 가이드gpt asset always active image_steps.py
22.5space_set_bg space set BG — frame/addon/life 3층 공간 세트 (W21B)gpt asset if_background_mode active space_set_bg_step.py
23ref_image_gen 요소 참조 이미지gemini-image asset always active image_steps.py
24composite_image_gen 인물+아웃룩 합성 이미지gemini-image asset if_has_outlooks active image_steps.py
24.5character_state_variant 인물 상태 변형 참조 이미지gemini-image asset always active image_steps.py
24.7background_chain_render 배경 chain 렌더 (deprecated, Phase 7로 대체)gpt asset disabled deprecated background_chain_render_step.py
24.72background_render 배경 이미지 생성gpt asset if_background_mode active background_render_step.py
24.73shot_conti_light 경량 콘티 (레시피)gpt-image-2 asset if_still_recipe active shot_conti_light_step.py
25scene_image_pipeline 씬 이미지 생성 (compound)mixed asset always active image_steps.py
100outlook_dedup 아웃룩 중복 판별gpt transform on_demand active outlook_steps.py
101project_summary 프로젝트 요약 (미구현)gpt transform disabled removed
lifecycleactive 가 아닌 스텝이다. 삭제하지 않는 것이 규칙이라 코드에 남아 있고, 매니페스트가 상태를 들고 있다. 새 경로를 읽을 때 이 목록에 있는 스텝은 건너뛰어야 한다.
orderstep_id이름상태대체
5scene_split큰 씬 분할 (레거시)deprecatedbeat_extract,shot_extract
17scene_cinematography촬영 감독 (레거시)deprecatedshot_staging
17.1shot_cinematographyShot별 촬영 기법 (deprecated)deprecatedshot_staging
18scene_dependency씬 연관 분석 (레거시 — disabled)deprecatedshot_dependency
19.3outlook_extraction아웃룩 추출 (레거시)deprecatedoutlook_phase1,outlook_phase2,outlook_phase3
19.55background_planner배경 생성 Planner (deprecated, Phase 7로 대체)deprecated
19.6background_chain_planning배경 chain 플래닝 (deprecated, Phase 7로 대체)deprecated
21scene_verify교차 검증 (레거시)deprecated
21.5location_floor_plan위치 도면 생성 (deprecated, Phase 7로 대체)deprecated
24.7background_chain_render배경 chain 렌더 (deprecated, Phase 7로 대체)deprecated
101project_summary프로젝트 요약 (미구현)removed

스텝 11개 — 상세

5 큰 씬 분할 (레거시) scene_split gemini-flash
병렬 fan-outon_demanddeprecated

Step 5: 큰 씬 분할 (조건부).

구현backend/app/core/steps/scene_steps.py 84줄
선행scene_segmentation
프롬프트 팩text_cleanup v1.202603231200·1판·1절 모듈 수준 추정
계약 type=transform · schema v— · provider=gemini
17 촬영 감독 (레거시) scene_cinematography gemini-pro
on_demanddeprecated

촬영 감독 -- 전체 씬 일괄로 촬영 기법 N가지 선택.

구현backend/app/core/steps/director_steps.py 90줄
선행scene_director
프롬프트 팩scene_cinematography v2.202603261200·2판·2절
계약 type=transform · schema v— · provider=gemini
17.1 Shot별 촬영 기법 (deprecated) shot_cinematography gemini-pro
병렬 fan-outdisableddeprecated

Shot별 촬영 기법 2개 선정.

구현backend/app/core/steps/shot_cinematography_step.py 141줄
선행shot_selection scene_director
프롬프트 팩shot_cinematography v1.202603281644·1판·2절 shot_selection v7.202607222349·6판·2절 shot_validator v7.202608071300·7판·1절
계약 type=transform · schema v— · provider=gemini
18 씬 연관 분석 (레거시 — disabled) scene_dependency gpt
disableddeprecated

씬 연관 분석 v2 -- 배경 중심 + 인물 중심 분리.

구현backend/app/core/steps/director_steps.py 45줄
선행scene_director
프롬프트 팩scene_director v10.202608070006·5판·1절
계약 type=transform · schema v— · provider=openai
19.3 아웃룩 추출 (레거시) outlook_extraction gemini-pro
on_demanddeprecated

Legacy: outlook_extraction → phase1+2+3 순차 실행.

구현backend/app/core/steps/outlook_steps.py 38줄
선행scene_director
프롬프트 팩entity_relation v3.202605181858·3판·2절 scene_director v10.202608070006·5판·1절 scene_summary v1.202603231200·1판·1절 visual_world_rules v10.202607080130·10판·1절 모듈 수준 추정
계약 type=transform · schema v— · provider=gemini
19.55 배경 생성 Planner (deprecated, Phase 7로 대체) background_planner gpt
disableddeprecated

단일 LLM 호출로 episode 단위 배경 생성 플랜을 결정.

구현backend/app/core/steps/background_planner_step.py 183줄
선행shot_validator shot_selection scene_director entity_merge entity_detail visual_world_rules
프롬프트 팩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절
계약 type=transform · schema v— · provider=openai
19.6 배경 chain 플래닝 (deprecated, Phase 7로 대체) background_chain_planning gpt
disableddeprecated

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_rules
프롬프트 팩background_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절
계약 type=transform · schema v— · provider=openai
21 교차 검증 (레거시) scene_verify gpt
병렬 fan-outdisableddeprecated

Step 17: 교차 검증 (앞2씬 컨텍스트). 조건부: 다중 캐릭터 씬만.

구현backend/app/core/steps/detail_steps.py 95줄
선행scene_detail
프롬프트 팩scene_detail v42.202608121750·37판·1절 scene_verify v2.202605181937·2판·1절
계약 type=editorial · schema v— · provider=openai
21.5 위치 도면 생성 (deprecated, Phase 7로 대체) location_floor_plan gpt
disableddeprecated

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_planner
프롬프트 팩background_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절
계약 type=asset · schema v— · provider=openai
24.7 배경 chain 렌더 (deprecated, Phase 7로 대체) background_chain_render gpt
disableddeprecated

Step: chain plan → 노드별 배경 PNG (gpt-image-2) + DB 등록.

구현backend/app/core/steps/background_chain_render_step.py 653줄
선행background_chain_planning location_floor_plan
프롬프트 팩background_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절
계약 type=asset · schema v— · provider=openai
101 프로젝트 요약 (미구현) project_summary gpt
disabledremoved
구현
선행episode_summary
계약 type=transform · schema v— · provider=openai