TheRoad Scene Lab · W21B-wave-4 · 2026-05-30
DRAFT v0 Claude 초안 → Codex cross-review 코드/DB/이미지 변경 0 (doc only)
사용자 제안(2026-05-30): "fp를 입력시켜 샷 내용을 설명하고, VLM에게 카메라를 어디서 어떤 형태로 놓으면 될지 + 거기서 무엇이 보일지 t2i처럼 서술하게 하자. 모든 BG의 그 output을 만든 다음, 다시 어떤 이미지를 어떤 순서로 참조시킬지 LLM에게 묻고, 그 output을 이전 참조 BG와 함께 넣어 BG를 생산하자." 본 문서는 이 제안을 현 파이프라인 제약 안에서 구현 가능한 형태로 양측(Claude·Codex) 합의한 v0 설계다.
W21B-wave-4 직전까지의 핵심 증상은 "fp와 배경이 안 맞는다"였다. v10 재생성으로 FP self-fidelity는 교정됐으나, BG가 FP의 실제 시각(視覺)을 소비하는 경로는 여전히 약하다. 코드 실측 결과:
| 관찰 | 실측 근거 |
|---|---|
| 카메라 결정이 두 군데로 흩어져 있고 둘 다 FP 이미지를 안 봄 | floor_plan_prompt(order 19.61)가 FP 렌더 전 텍스트(도면 spec)로 camera_recommendations 생성 /
shot_aware_bg_render_plan(21.595)이 FP 렌더 후지만 이미지 대신 geometry(grid cell 좌표 텍스트)·dossier로
camera_decision 결정 |
| "렌더된 FP 이미지를 VLM에 보여주고 카메라/가시물체를 판단"하는 단계가 아예 없음 | 현 파이프라인 전 단계 grep — 해당 입력 경로 부재. floor_plan_semantic_readback(신규)은 카메라가 아니라
"FP가 자기 dossier에서 drift했나" self-fidelity 검증용 |
| BG t2i와 샷 최종 t2i(scene_detail) 사이에 공유 contract가 없음 | scene_detail(21.70)이 BG보다 나중에 BG PNG를 배경 가이드로 소비 — 정합은 PNG 한 장에만 의존 |
scene_detail, 21.70)는 BG(21.60)보다
나중에 생성된다. BG PNG가 scene t2i의 배경 가이드이기 때문이다. 따라서 사용자 제안의 "샷 최종 t2i를 카메라 plan 입력에 넣기"는
순서상 순환이라 불가. scene_detail을 앞으로 당기면 BG↔scene 참조 의존이 역전돼 blast radius가 크다.
shot_projection_cardshot_projection_card를 만든다.
핵심 전환: "최종 t2i를 미리 넣기"가 아니라 "최종 t2i가 따라야 할 공통 shot contract를 먼저 만들기".
card가 SOT가 되어 background_prompt와 scene_detail 둘 다 같은 card_id/card_hash를 소비하면 정합이 실현된다.
| Step | 입력 | 출력 / 역할 |
|---|---|---|
| A · shot_projection_card 신규 real VLM 위치: semantic_readback 이후, plan 이전 step id 확정: shot_projection_card (per-shot 공통 SOT 성격상 view_projection보다 정확) |
light_fp analysis raster + detailed FP PNG + overlay legend + camera_recommendations(pose 후보) + shot text/shot_guides/visible_entities hard dep = geometry/dossier/overlay. semantic은 enabled면 gate, disabled면 not_available로 기록(§7) |
(bg_id, shot_id) 단위 shot_projection_card 산출 (§4). VLM은 좌표를 만들지 않고 이미지를 보고
무엇이 어디쯤 보이는지 서술/분류만. |
| B · shot_aware_bg_render_plan vNext 역할 축소 |
+ 모든 projection card 추가 | 카메라 결정에서 손 떼고 reference graph / reuse / render_action만 전역 결정. 어떤 card를 같은 plate로 묶을지, anchor shot 선택. |
| C · background_prompt vNext 수정 |
+ anchor shot card | card의 t2i_visible_description을 BG t2i_prompt에 통합. internal enum/marker는 누출 금지(§6). |
| D · scene_detail 수정 |
+ 같은 card (card_hash 소비) | BG와 최종 scene t2i가 같은 shot contract를 따르게 함. |
shot_projection_card v0 schema — 2층 구조사용자 단서 "1번을 t2i가 알아들을 수 있는 형태로"를 반영해 output을 2층으로 나눈다. 그 위에 provenance/상태 top-level layer를 둔다.
card 식별·캐시 무효화·gate 판정의 근거. Codex 리뷰 반영.
card_id · schema_version · prompt_version · model · providerbg_id · shot_id · fp_idcard_state — pass | needs_review | blockedsource_hashes{} — fp_render_hash, light_fp/substrate_hash, overlay_hash, geometry_hash, semantic_hash(or not_available), camera_rec_hash, shot_context_hash(normalized), prompt_version, schema_version, model/provider (§6)substrate_kind {light_fp | detailed_fp | both} · substrate_statuscamera_pose_source — 기존 후보 중 어느 것을 선택·서술했는지 (좌표 생성 X)confidence · missing_inputs[]코드 정합 · Pass B · deterministic gate 전용. prompt 비노출.
visible item 단위:
marker_number — internal only (evidence join)expected_label — internal only (dossier verbatim)visibility — visible | partial | occluded | out_of_framehorizontal_band — left / center / rightdepth_band — foreground / midground / backgroundocclusion_note · evidence · source_ref · confidencet2i_visible_descriptionT2I 전달 표면. 좌표/grid 없이 자연어 시각 묘사.
"전경 왼쪽에 낡은 스테인리스 싱크대와 낮은 조리대, 중앙에는 좁은 식탁, 배경 오른쪽에 미닫이문 두 개가 보인다."
background_prompt vNext가 이 prose를 t2i_prompt에 자연스럽게 통합한다. optional not_visible_or_occluded_summary 추가 가능.
Pass-B 전용 field(anchor_candidate_score / plate_grouping_notes)는 card가 아니라 plan vNext 산출로 둔다 — card는 shot observation SOT에 집중.
10×10 grid / camera_view_grid는 제외.
사용자가 거부한 것은 "LLM의 좌표 생성"(v8 Path-S "LLM 절대 못 그려" 폐기)이다. VLM은 이미지를 보고 서술/분류만 하고, 카메라 pose는 새 좌표를
만들지 않고 기존 camera_recommendations/geometry 후보 중 선택·서술만 한다. grid가 필요해지면 별도
user-confirmed diagnostic 또는 deterministic geometry 후처리로만 두고, VLM output SOT로 두지 않는다.
(bg_id, shot_id) 단위로 생성 (per-bg로 합치면 정보가 뭉개짐).render_new_plate / reuse_existing_plate를 결정하고, plate별 anchor shot card를 고른다.첫 land부터 hard gate까지 가면 blast radius가 크므로 단계화한다.
| 단계 | gate 종류 | 내용 |
|---|---|---|
| v0 (첫 land) | deterministic hard | card present / card_hash match / marker 번호·annotation leakage 0 / visible·transient list와 명백한 모순 없음 |
| v0 | diagnostic | 이미지·문장 품질 위반 → needs_review (block 아님) |
| 후속 (dry/E2E 안정 후) | hard 추가 | must_show / must_not_show hard gate |
t2i_visible_description에 internal token이 그대로 새면 안 된다: marker 번호(#12 / marker 12),
영어 enum literal(left/center/right/foreground), card_id/hash, "numbered marker" 같은 annotation 용어.
한국어 자연어 공간표현("왼쪽/중앙/배경")은 허용 — 금지 대상은 내부 enum literal이지 자연어 공간어가 아니다.
다음 중 하나면 BG prompt에 card를 넣지 않고 fail-closed — fallback은 기존 v10 prompt path 또는 needs_review:
confidence 낮음 / missing_inputs 있음needs_fixsource_hashes mismatchv0는 contradiction을 완전 검증하기 어려우므로, VLM self-consistency field + simple no-leak/no-missing deterministic gate부터 넣고, dry/E2E 안정 후 강화한다.
2-pass로 콜 수가 늘기 때문에 캐시 키가 필수다. active 21 전부가 아니라 changed FP/BG부터 돌릴 수 있어야 한다.
source_hashes를 raw text 대신 분리·normalized로 기록 — shot 내용/shot_guides/camera_rec 변경 시 card invalidation.
source_hashes = {
fp_render_hash, light_fp/substrate_hash, overlay_hash,
geometry_hash, semantic_hash | "not_available",
camera_rec_hash, shot_context_hash, # raw text 아님 = normalized
prompt_version, schema_version, model/provider
}
card_cache_key = hash(source_hashes + bg_id + shot_id)
| 기존 자산 | projection card 파이프라인에서의 역할 |
|---|---|
floor_plan_prompt.camera_recommendations | 초기 카메라 pose 후보 (VLM이 선택·서술, 생성 아님) |
floor_plan_overlay_payload | 번호/label legend (VLM 입력) |
floor_plan_geometry_readback | marker grid sanity — deterministic grounding (대체 X, 위에 얹는 hybrid) |
floor_plan_semantic_readback | FP self-fidelity gate. default OFF — hard 전제로 쓰지 않고 enabled면 semantic_gate_state 기록(pass/needs_review/needs_fix), disabled면 not_available. drift한 FP(needs_fix)는 card fail-closed |
| light_fp analysis raster | VLM projection substrate |
| detailed FP PNG | BG visual anchor (render 참조) |
vlm_output_schema strict + card_envelope_shape 조립). VLM self-report(vlm_reported_state)와
validator 산정(validator_state/card_state) 분리. dry 통과 후 prompts/_base/shot_projection_card/1.<ts>/ 승격.본 설계는 특정 시나리오(옥탑방/마트/특정 prop·문구) 기반 rule을 두지 않는다:
| # | 결정 | 근거 |
|---|---|---|
| 1 | Step A 위치 = semantic_readback 이후 / plan 이전. geometry/dossier/overlay는 hard dep, semantic은 default OFF라 hard 전제 X — card에 semantic_gate_state 기록(enabled=pass/needs_review/needs_fix, disabled=not_available) | semantic은 현재 default OFF/quality gate 성격 |
| 2 | plan vNext에서 camera_decision 완전 제거 금지. compatibility/audit field로 남기되 authority를 card로 demote. card_hash 불일치 시 diagnostic/fail-closed. planner 주 역할 = reference graph/reuse/render_action | 현 validator가 camera_decision 필수 shape 요구 + route_render_actions가 camera_unit/look_at_unit으로 reuse 결정 → 즉시 제거 시 blast radius 큼 (code 교차확인) |
| 3 | card_hash에 shot text 포함 = YES, raw 대신 normalized shot_context_hash. source_hashes 분리 기록(§6). shot/shot_guides/camera_rec 변경 시 invalidation | 정합 SOT이므로 입력 변경이 card를 무효화해야 함 |
| 4 | default OFF. step id = shot_projection_card. config: shot_projection_card_enabled=false, shot_projection_card_real_provider_enabled=false, shot_projection_card_prompt_version="1". 첫 land = dry/schema only, real VLM은 explicit force/cap | 기존 wave 패턴(새 step default off + 명시 force) + per-shot 공통 SOT 성격 |
| 5 | light_fp는 analysis substrate로만 production sidecar/cache에 올림 — detailed FP를 교체하지 않음. card에 substrate_kind{light_fp|detailed_fp|both}/status/hash. light_fp 없으면 detailed fallback + confidence downgrade/needs_review | 8794에서 light_fp가 projection confidence/grounding을 올린 근거 있음 |
W21B-wave-4 · shot_projection_card v0 DRAFT · 2026-05-30 · Claude 초안
관련: floor_plan_semantic_readback(self-fidelity gate) · shot_aware_bg_render_plan(현 planner) · background_render(v10 검증 완료)
제약: 특정 시나리오 일반화 금지 · 글자단위 패턴 금지 · 비용 $10미만 자율/이상 합의 · /tmp 우선 · destructive cleanup 금지 · TDD로 LLM/VLM/T2I 완성도 보장 불가(visual review만)