TheRoad Scene Lab · W21B-wave-4 · 2026-05-30

shot_projection_card — 배경(BG) 2-pass projection 설계 brief

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 설계다.

1. 문제 정의 — 현재 BG는 "렌더된 FP 이미지"를 보지 않는다

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 좌표 텍스트)·dossiercamera_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 한 장에만 의존

2. 현 파이프라인 순서 (order 번호 실측)

floor_plan_prompt 19.61 · camera_recommendations floor_plan_render 21.55 · FP PNG overlay_payload 21.57 dossier 21.58 geometry_readback 21.59 semantic_readback 21.591 · default OFF shot_aware_bg_render_plan 21.595 background_prompt 21.60 · BG t2i background_render BG PNG scene_detail 21.70 · 샷 최종 t2i
★ 닭-달걀 (사용자가 "고민해봐"라고 짚은 지점): 샷 최종 t2i(scene_detail, 21.70)는 BG(21.60)보다 나중에 생성된다. BG PNG가 scene t2i의 배경 가이드이기 때문이다. 따라서 사용자 제안의 "샷 최종 t2i를 카메라 plan 입력에 넣기"는 순서상 순환이라 불가. scene_detail을 앞으로 당기면 BG↔scene 참조 의존이 역전돼 blast radius가 크다.

3. 합의된 해법 — 공통 선행 산출물 shot_projection_card

순서 재배치 대신, BG와 scene_detail이 둘 다 읽는 공통 선행 산출물 shot_projection_card를 만든다. 핵심 전환: "최종 t2i를 미리 넣기"가 아니라 "최종 t2i가 따라야 할 공통 shot contract를 먼저 만들기". card가 SOT가 되어 background_prompt와 scene_detail 둘 다 같은 card_id/card_hash를 소비하면 정합이 실현된다.

3.1 4-step 구조

A. shot_projection_card 신규 · VLM B. shot_aware_bg_render_plan vNext 역할 축소 C. background_prompt vNext D. scene_detail 같은 card 소비
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를 따르게 함.

4. shot_projection_card v0 schema — 2층 구조

사용자 단서 "1번을 t2i가 알아들을 수 있는 형태로"를 반영해 output을 2층으로 나눈다. 그 위에 provenance/상태 top-level layer를 둔다.

top-level (provenance · 상태)

card 식별·캐시 무효화·gate 판정의 근거. Codex 리뷰 반영.

(a) Internal structured fields

코드 정합 · Pass B · deterministic gate 전용. prompt 비노출.

visible item 단위:

  • marker_number — internal only (evidence join)
  • expected_label — internal only (dossier verbatim)
  • visibilityvisible | partial | occluded | out_of_frame
  • horizontal_band — left / center / right
  • depth_band — foreground / midground / background
  • occlusion_note · evidence · source_ref · confidence

(b) t2i_visible_description

T2I 전달 표면. 좌표/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에 집중.

★ 좌표 금지 (사용자 핵심 제약): v0 schema에서 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로 두지 않는다.

4.1 granularity — per-shot

5. 정합 강제 (enforcement) — 단계적

첫 land부터 hard gate까지 가면 blast radius가 크므로 단계화한다.

단계gate 종류내용
v0 (첫 land)deterministic hard card present / card_hash match / marker 번호·annotation leakage 0 / visible·transient list와 명백한 모순 없음
v0diagnostic 이미지·문장 품질 위반 → needs_review (block 아님)
후속 (dry/E2E 안정 후)hard 추가 must_show / must_not_show hard gate

5.1 Leakage rule Codex 추가 축

t2i_visible_descriptioninternal token이 그대로 새면 안 된다: marker 번호(#12 / marker 12), 영어 enum literal(left/center/right/foreground), card_id/hash, "numbered marker" 같은 annotation 용어. 한국어 자연어 공간표현("왼쪽/중앙/배경")은 허용 — 금지 대상은 내부 enum literal이지 자연어 공간어가 아니다.

★ 사용자 "글자단위 패턴 금지" 제약과의 구분: 이 leakage check는 의미 추출/판단이 아니라 우리가 schema로 정의한 self-defined internal token(정수 marker 번호값, 고정 enum literal, card_id)의 exact 누출 검사다. 한국어 문장의 의미를 substring/조사 패턴으로 구분·판단하지 않는다. 따라서 시나리오-종속 lexicon matcher가 아니며 사용자 제약(글자/조사/word-boundary 의미판단 금지)과 충돌하지 않는다.

5.2 Failure policy Codex 추가 축

다음 중 하나면 BG prompt에 card를 넣지 않고 fail-closed — fallback은 기존 v10 prompt path 또는 needs_review:

v0는 contradiction을 완전 검증하기 어려우므로, VLM self-consistency field + simple no-leak/no-missing deterministic gate부터 넣고, dry/E2E 안정 후 강화한다.

6. 캐시 키 — 변경분만 재실행

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)

7. 기존 자산 재사용 매핑

기존 자산projection card 파이프라인에서의 역할
floor_plan_prompt.camera_recommendations초기 카메라 pose 후보 (VLM이 선택·서술, 생성 아님)
floor_plan_overlay_payload번호/label legend (VLM 입력)
floor_plan_geometry_readbackmarker grid sanity — deterministic grounding (대체 X, 위에 얹는 hybrid)
floor_plan_semantic_readbackFP 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 rasterVLM projection substrate
detailed FP PNGBG visual anchor (render 참조)

8. 실행 계획 — brief → dry → E2E

  1. brief 합의 (본 문서) — schema v0 / step 경계 / gate 확정. 코드 0
  2. schema 초안 작성됨schema_draft.json 완료 — 2-layer(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>/ 승격.
  3. text-only dry — L05B09(투룸 anchor) / L09B01(마트 anchor) 대표 1 shot씩. card → t2i_prompt가 어떻게 달라지는지 이미지 비용 0으로 확인. 8794에서 이미 얻은 결과를 baseline으로.
  4. 소규모 E2E — 2~4 BG cap. card가 실제 BG PNG에 반영되는지. 추정 비용 ≪ $10.
  5. 이후 multi-shot bg에서 merge/anchor 정책 검증.

9. 시나리오 leakage 금지 증명

본 설계는 특정 시나리오(옥탑방/마트/특정 prop·문구) 기반 rule을 두지 않는다:

10. 확정된 결정 (Codex cross-review lock, 2026-05-30)

#결정근거
1Step 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 성격
2plan 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 교차확인)
3card_hash에 shot text 포함 = YES, raw 대신 normalized shot_context_hash. source_hashes 분리 기록(§6). shot/shot_guides/camera_rec 변경 시 invalidation정합 SOT이므로 입력 변경이 card를 무효화해야 함
4default 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 성격
5light_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_review8794에서 light_fp가 projection confidence/grounding을 올린 근거 있음

10.1 남은 확인 (schema.json 초안 단계에서)

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만)