# 금월도 fresh E2E — 육안 8문제 심층 분석 + 수정방향 (2026-06-19)

> **이 문서는 분석 + 수정방향만. 구현은 다음 세션.**
> **절대 원칙: 모든 fix 는 100% generic. 특정 시나리오/장면/인물명/장소명/소품명/한국어 어휘를
> 코드·프롬프트·정규식·substring·토큰경계로 의미판정하는 것 절대 금지. 구조 신호(entity_type,
> framing_scale enum, subject_state enum, shot_dependency, VE 출현수, geometry 좌표 등)만 사용.**

대상 run: pid=`7bea6537-cad7-4739-ae13-17ce36cb1956` / eid=`bee89290-7f23-4d24-ab0e-8ed506d0502c`
(HEAD=cae7e566). 모든 근본원인은 코드 file:line + DB(llm_call_log.reference_image_ids = 실제 nb2
첨부 라벨, gemini_image_client.py:125-134) + 체크포인트 실측으로 확인. 5클러스터 병렬조사 후
적대적 검증으로 정정한 결과.

---

## 0. 관통하는 3가지 메타 근본원인 (개별 문제보다 먼저)

이 8문제는 표면이 달라 보이지만 아래 3개의 공통 결함에서 파생된다. 수정은 이 메타원인 단위로
설계해야 단발 패치가 아니라 구조 개선이 된다.

### 메타-A. "생성용 프롬프트"와 "식별용 라벨"의 혼동 (→ P1, P3, P6)
nb2/i2i 에 들어가는 텍스트에는 두 종류가 있는데 코드가 이를 구분하지 않고 한 쪽을 다른 쪽으로
재사용한다.
- **생성용(generation)**: "이런 이미지를 *새로 그려라*" — 예: `entity_canon.t2i_prompt`
  ("Passport-style ID photo, plain white background, A Korean woman in her early 20s…"),
  zoom anchor `locked_elements[].description`(씬 원문 기반 LLM 자유서술, **인물명 포함**).
- **식별용(recognition descriptor)**: "*이미 첨부된* 이미지/crop 속의 이 대상을 가리킨다" — i2i 는
  픽셀만 보고 이름·passport 설정을 모름.
- 현재 코드는 생성용 텍스트(이름·passport 캐논 전문·작문체 산문)를 식별용 라벨/locked-fact 로
  통째 주입한다 → i2i 가 이름을 노이즈로 받고, 무관한 캐논(plain white bg 등)에 혼란.

### 메타-B. "게이트 없는 best-effort + 육안 반복" 철학의 사각 (→ P2, P5, P6)
이 파이프라인은 의도적으로 plate fidelity·마킹 정확·참조 충돌에 **fail-fast 게이트를 두지 않는다**
(예: `frame_check` 주석 "게이트 아님", marked-FP position VLM 실패 시 center fallback 도 게이트
아님). 그래서 "판매장 plate 가 보안실로 렌더돼도", "as-is + 지워라 모순 라벨이 충돌해도",
"ring 이 disc 로 평탄화돼도" 아무도 막지 않는다. → 수정은 thick 게이트가 아니라 **진단 surface +
재생성 트리거**(이 철학과 정합)로 설계.

### 메타-C. 단계 간 구조화 출력의 단절 + 연속성 계약의 소비 누락 (→ P6, P8)
앞 단계가 이미 구조화해 잡은 사실이 다음 단계 입력으로 안 이어지거나, 만들어진 계약이 소비처에서
안 쓰인다.
- P6: entity_extract 가 잡은 "ring(빈 테두리)" visual_traits 가 entity_detail 입력으로 전달 안 됨
  → detail LLM 이 fulltext 만 재요약하며 "red circle" 로 평탄화.
- P8: zoom_continuity anchor 가 시신 자세를 `locked_elements` 로 이미 계약했는데, scene_detail 의
  anchor 주입 블록(`detail_steps.py:2970`)이 **printed_prop 전용**이라 그 계약을 소비 안 함
  ("W-C 별도 wave" 미구현). + 부동 인물 연속성 seed 탐지기 자체가 없음.

---

## P1 — i2i zoom/refine 프롬프트에 인물명 + 모순 지시 (S5sh11→S5sh12)

**증상**: 손목 표식 확대 샷. nb2 i2i 프롬프트에 `Locked visual facts … 수리영 is close to
민숙's shoulder …; 민숙's wrist …` (인물명) + "Refine into a sharp, **detailed close-up**" 와
"keep EVERY element exactly … Do NOT add/move/remove" 가 동시 명령.

**근본원인** (메타-A):
- `zoom_continuity_render_service.py:60-67` `_FILL_PROMPT` 상수가 (i) 디테일 강화(refine/enhance
  sharpness/texture/detail) 와 (ii) 완전 고정(keep EVERY element, Do NOT add) 을 한 문장군에서
  동시 요구 → 모델이 "새로 그릴지 vs 고정할지" 충돌.
- `build_fill_prompt`(:88-103, 핵심 :96-99)가 `zoom_target.locked_elements[].description` 을
  그대로 join → i2i "Locked visual facts" 로 주입.
- description 원천: `visual_continuity_anchor_plan.py:270`(build_zoom_group) ← LLM 추출. 추출 스키마
  `visual_continuity_anchor_provider.py:49-52`(`_LOCKED_ELEMENT_SCHEMA.description`="one English
  sentence stating the locked visual fact")가 **인물명 회피/시각식별자 사용 제약 없음**.
  LLM 입력은 `build_zoom_anchor_user_prompt`(provider.py:347)가 씬 원문 전체(인물명 포함)를 주므로
  LLM 이 자연히 "수리영/민숙" 으로 작성. (실측: vca-s5-zoom-2 locked_elements 5개 전부 이름 포함.)

**수정방향** (generic):
1. **이름 제거**: `_LOCKED_ELEMENT_SCHEMA.description` + `ZOOM_ANCHOR_SYSTEM` 에 "인물/소품을
   고유명사·entity ID 로 지칭 금지, 화면상 위치(left/right/foreground)·외형·신체부위·역할로만 서술"
   제약 추가(생성 자체를 generic 하게). **또는** 소비단(build_fill_prompt)에서 자유서술 description
   대신 `locked_element.kind` enum(subject_pose/held_prop/prop_state/surface_state) + 구조적 화면
   위치 필드로 재조립.
2. **모순 해소**: `_FILL_PROMPT` 를 i2i 본질(crop 픽셀=SOT, 해상도/선명도만 복원)에 맞게 단일 의도로
   재작성 — "구성·포즈·위치·요소 전부 첫 참조(crop)와 동일 유지, 확대로 뭉개진 텍스처/엣지만 선명화,
   새 요소·새 디테일 발명 금지". "detailed close-up"(=디테일을 더 그려라로 읽힘) 표현 제거.

**시나리오 의존 가드**: 이름을 substring/조사 패턴으로 사후 제거하면 글자판정(절대금지). →
생성단 스키마/시스템프롬프트 제약 또는 kind-enum 재조립으로만. 토큰 0.

---

## P3 — 참조 이미지 라벨이 i2i 가 이해 불가 (전 샷)

**증상**: nb2 첨부 라벨이 (1) 배경="Reference image 1: pre-rendered BACKGROUND environment
reference — layout/material/lighting identity" (무슨 공간인지 시각 설명 0), (2) 인물="Image 2
(character reference): 수리영 — Set in mid-2020s… Passport-style ID photo… A Korean woman in her
early 20s…" (이름 + passport 캐논 전문), (3) 이중 prefix "Reference image 2: Image 2 (…)".

**근본원인** (메타-A):
- **인물 라벨**: `scene_reference_service.py:106-109` `build_image_index` 가 `name` +
  `t2i_prompt`(reference 이미지를 *생성*할 때의 passport 지시문) 통째 결합. 이건 식별용이 아님 →
  이름 노이즈 + passport 설정(plain white bg, ID photo)이 씬 식별에 무관. prop 도 동일(:116-119).
- **배경 라벨**: `prompt_service.py:312-329` 의 배경 role 라벨이 역할만 적고 환경의 시각 내용(공간
  종류/주요 재질/조명) 없음.
- **이중 prefix**: `build_image_index` 가 "Image N:" 붙이고 `prompt_service.resolve_ref_roles`
  (:358/:368/:380…)가 다시 "Reference image N:" 을 붙여 중복. 라벨 책임이 두 레이어에 분산.
- (검증 정정: 위 background 라벨 두 변형은 S5sh11 에 실주입된 변형과 다른 role. 결함 자체는 실재하나
  "어느 샷에 어느 변형" 은 role 별로 확인 필요.)

**수정방향** (generic):
1. 인물 라벨에서 고유명사 제거 + 간결화: name + passport t2i 전문 대신 i2i 가 픽셀로 대조 가능한
   짧은 시각 식별자(성별/연령대 클래스/머리·체형 등 외형 핵심)만. 이름 연결은 본문 프롬프트의
   "the character from Image N" 메커니즘(`scene_reference_service.py:150 rewrite_t2i_with_image_refs`)이
   이미 번호로 하므로 라벨엔 불필요.
2. 배경 라벨에 구조적 환경 식별자(dwelling_zone_map/space_set_bg 가 이미 가진 공간/zone·주요 재질·
   조명 데이터)를 간결히 포함.
3. 이중 prefix 일원화(한 레이어만 prefix).

**시나리오 의존 가드**: 외형 식별자는 entity 의 구조적 외형 필드에서, 환경 식별자는 zone/space
구조 데이터에서. 작문체 캐논 전문 통째 주입 중단. 작품 토큰 0.

---

## P2 — 마트 매장 장면에 CCTV/보안실 렌더 (S8sh3)

**증상**: bg 라벨="space set background ref (판매장, bg_large_mart)" 인데 최종에 보안실(모니터/책상)이
렌더. (4중 교차검증: 로그 + plate PNG + FP + 최종.)

**근본원인** (메타-B): plate **오배정 아님 = plate fidelity 실패**. 판매장 plate 자체가 보안실로
생성됨. marked-FP i2i 의 구조적 약점 — 한 FP 안에 (a)마킹된 '넓고 sparse 한 저정보 방'(판매장=빈
진열 셸)과 (b)마킹 안 된 '작고 시각정보 밀집한 방'(모니터·책상 심볼의 보안실)이 공존하면, i2i 가
red-circle 마킹을 무시하고 "그리기 쉬운/꽉 찬" 방으로 anchor. "ONLY that marked room" 텍스트로는
못 이김. **렌더된 plate 가 마킹한 방이 맞는지 검증하는 게이트 없음**(frame_check 는 FP 구조 보존만
보고 plate↔target room 일치는 안 봄).

**수정방향** (generic, 메타-B 철학=진단 surface + 재생성 트리거):
1. plate 생성 후 **target-room 일치 진단(VLM)**: 생성 plate 를 입력 view brief 의 `fixed_elements`
   목록·enclosure 와 evidence-backed(quote + confidence) 대조, 불일치 시 재생성(마킹 강조/크롭).
   방 이름·어휘 매칭 금지 — view brief 의 구조 필드(fixed_elements, enclosure)만.
2. 같은 그룹 내 marked plate 들 간 near-duplicate(두 방이 같은 방으로 collapse) 진단 → surface 후
   재생성.
3. marked-FP i2i 입력 강화: 마킹 방 crop/zoom 보조 입력 또는 비대상 방 마스킹/흐림으로 anchor 강제.
   전부 FP geometry(방 bbox, 심볼 밀도)만 사용.

**시나리오 의존 가드**: "보안실/판매장" 같은 방 이름 매칭 절대 금지. view brief 의 구조 필드 +
geometry 만. 게이트가 아닌 진단으로 시작(육안 반복 철학 정합).

---

## P4 — 침실 샷에 침대 없음 (S12sh8) — **우선순위 낮음 (의도된 동작)**

**증상**: bg="작은 침실(bg_rooftop_villa_unit)" 인데 최종에 침대 없음.

**근본원인** (검증으로 재분류): plate fidelity 결함 **아님**. FP(`fp_marked_space4.png`)에 침대 심볼
정확, canonical plate(`bg_space4.png`)에 침대 실재. 이건 `derive_from_base` 의 **의도된 동작** —
shot 본문 피사체(커튼 뒤 시신)에 맞춰 LLM(SHOT_ASSIGN)이 derive_instruction 을 "커튼 영역만 프레임"
으로 작성 → 파생 plate 가 침대를 의도적으로 프레임 밖 배제. 즉 그 샷이 침대를 안 보는 구도라 정상에
가깝다.

**수정방향** (낮은 우선순위, generic 개선 여지만): derive 파생 plate 가 "같은 공간 정체성"을 잃지
않도록 derive_instruction 생성 규칙에 "공간 식별 가능한 고정 anchor 최소 1개를 프레임 가장자리에
유지"(`space_set_bg.py SHOT_ASSIGN_SYS` 의 기존 문구 강화). 침대/방 이름 특정 금지 — "그 공간의
고정 구조/설비 중 하나" 구조적 표현만.

---

## P5 — 고양이 시점 창문이 불가능한 기하/발광 void (S17sh1)

**증상**: ref="previous shot at same location (SAME ROOM) — use this background **as-is**. **Ignore
the silhouettes on the window**." → 최종 창문이 평면 발광 void.

**근본원인** (메타-B): 모순 결합. `shot_dependency_t2i`(LLM)가 S17sh1 의 prev background 로 S10sh6 를
`exact_background(use as-is)` 로 고르면서 동시에 `ignore_elements="Ignore the silhouettes on the
window"` 부여. 그런데 그 소비된 prev 프레임은 창의 콘텐츠=실루엣 그 자체. `scene_reference_service`
가 두 신호를 한 라벨로 합성("use as-is" + "ignore the silhouettes")해 i2i 에 전달 → 같은 영역(창)에서
"유지하라" vs "지배 콘텐츠 지워라" 충돌 → 채울 정보 없어 평면 발광 void 환각.
(검증 정정: 강등 대상은 "derive 파생 plate" 가 아니라 **실제 소비된 prev-shot 최종 이미지** — 파생
plate 자체는 transient-free.)

**수정방향** (generic):
1. ref 선택(shot_dependency_t2i) 또는 소비(scene_reference_service)에서 "as-is 로 쓸 prev background
   가 ignore 대상 transient(이동/임시 캐릭터·실루엣)로 지배되는 프레임이면 `exact_background` 부적합"
   판정 → `atmosphere_reference`(layout 복제 X, 분위기만) 또는 transient-free base space_set_bg plate
   로 강등. 판정 신호=prev still 의 visible_entities 중 transient 가 ignore_elements 와 겹치고 그
   프레임 framing_scale 이 그 영역 집중인지(구조 신호).
2. 같은 opening 영역(창/문)에 keep_elements 와 ignore 가 동시에 걸리면 "as-is" + "subtract" 동시 부여
   금지 → 그 영역은 transient 없는 base plate 를 background SOT 로.

**시나리오 의존 가드**: "실루엣/창" 단어 매칭 금지. visible_entities transient 여부 + framing_scale +
ignore_elements 겹침의 구조 신호만.

---

## P6 — 원형 표식이 ring(테두리) 아닌 채워진 붉은 disc(일장기) (전 등장)

**증상**: 소품 "원형 표식"(P08)이 손목/벽에 붓으로 그린 **빈 중심 붉은 링**이어야 하는데 채워진 붉은
원(disc)으로 렌더. 최초 추출은 ring 으로 잡았으나 하류에서 평탄화.

**근본원인** (메타-C): ring→disc 정보손실이 **entity_detail 단계**에서 발생.
- `EntityDetailStep` 의 entity_queue 는 (name,type,short_id)만 담고(`entity_steps.py:608-618`), 상세
  프롬프트(turn1_7_detail_batch)에 entity_list(이름)+fulltext 만 주입(:641-645) → 추출이 확정한
  visual_traits("가운데 빈 원형 테두리")가 **상세 단계로 전달 안 되고 폐기** → detail LLM 이 fulltext
  인용문에서 재요약하며 "red circle" 로 평탄화.
- 상세/생성 프롬프트가 **형태 위상(채워진 disc vs 빈 ring/outline/stroke)을 보존하라는 구조 지시 없음**
  (turn1_7_detail_batch.md:20 "물체의 형태/재질/크기/색상" 은 fill/contour 미언급).

**수정방향** (generic):
1. **정보보존(가장 근본)**: `EntityDetailStep` 이 추출 단계의 visual_traits/description 을 상세 프롬프트
   컨텍스트로 함께 주입(entity_queue + turn1_7_detail_batch 입력 확장) — 이전 단계 구조화 출력을 다음
   단계 입력으로 잇는 데이터 배선(글자/regex 아님). + "추출 visual_traits 와 모순되는 형태 단순화 금지"
   generic recall 지시.
2. **형태 위상 구조화 속성화**: 물체 description/visual_traits/t2i 작성 규칙에 색·재질·크기와 동급으로
   "형태 위상(filled solid vs outline/hollow/stroke)"을 evidence(source_quote) 근거로 보존하라는 일반
   지시. 모든 2D 도형/마크/심볼 prop 에 적용(특정 작품 표식 아님).

**★검증 정정(중요)**: 이 fix 를 **visual_continuity_anchor 의 prop anchor 경로로 라우팅하면 안 됨**.
carries_printed_content=false prop(P08)은 `visual_continuity_anchor_step.py:104` 게이트에서 by_prop
채우기 직전 제외되므로 PROP_ANCHOR STEP2 를 완화해 physical_form 을 채워도 소비처(detail_steps:2985)에
도달 못 함. → P6 는 반드시 **entity_detail/entity_t2i 캐논 경로**(씬 프롬프트에 실제 도달)로 고친다.
P0d(cae7e566)와 충돌 없음 — P0d 는 "비인쇄 prop 에 인쇄내용 발명 차단", P6 는 "형태 위상 보존"으로 직교.

**시나리오 의존 가드**: "원/링/표식" 단어 매칭 금지. 형태 위상은 evidence(source_quote) 기반 구조 속성으로.

---

## P7 — 어려운 구도에 스케치 미생성 (S26sh8; 전체 58샷 중 스케치 1개)

**증상**: 각도/구도 어려운 샷에 composition guide 스케치 0. 이번 run 전체에서 스케치 1개(S15sh6)뿐.

**근본원인** (구조적 협착): composition guide 가 **"outdoor departing" 단일 클래스에만 매여 있음**.
3중 funnel 로 어려운 구도가 배제(58 → loc-token outdoor 24 → angles≥2 5 → seed 멤버 2 → admitted 1):
1. **최상위 outdoor seed 게이트**: guide 생성이 `outdoor_site_layout` seed 루프 안에 nested → VE 에
   is_indoor==false loc 토큰 있는 샷만 진입. 실내 복잡구도/시체 인서트/손 확대는 진입조차 못함.
2. **기하 게이트 G1**: "receding mover(멀어지는 이동 인물)" 필수 → 정지 대치/인서트/클로즈업 탈락
   (검증: seed 루프 내부 `plan:141-156` 의 len(angles)<2·single_figure·zoom 필터에서 대부분 탈락).
3. **의미 judge G2**: "open-exterior departure" 만 admit, 근접 대치/실내/인서트 명시 deny.
→ "어려운 구도" = "멀어지는 야외 2인" 으로 정의 자체가 협소.

**수정방향** (generic): "스케치 필요한 어려운 구도"를 outdoor-departing 와 분리된 구조 신호 집합으로
재정의해 후보 진입 확대.
1. 최상위 seed 게이트를 outdoor loc 토큰 필수에서 해제 — 후보 수집을 outdoor seed 루프에서 떼어내
   selected shot 전체 순회 별도 후보 단계로(좌표 의존 G1 은 outdoor 그룹 한정 유지하되, 좌표 없이도
   판정 가능한 난이도 신호로 후보 추가).
2. 난이도 후보 신호를 **구조 enum 으로 합성**: `framing_scale ∈ {insert}` (인서트/디테일), 또는
   다인물(`character_angles` 길이 ≥ N) AND 비대칭 angle 조합(over_shoulder/three_quarter enum 집합),
   또는 `frame_spatial_contract.depth_plane` 가 foreground+midground 양쪽 점유(깊이 분리 대치) 등
   좌표·enum 신호. (이 framing_scale enum 은 `visual_continuity_anchor_plan.py:53` 가 이미 난이도
   신호로 소비 중이라 재사용 가능.)
3. 의미 judge 를 "open-exterior departure" 외 일반 "구도 난이도(깊이 분리/다인물 상호작용/극단 스케일
   대비)" 까지 admit 하도록 확대.

**시나리오 의존 가드**: 어휘/장면 매칭 금지. framing_scale·angle·depth_plane enum 과 좌표만.

---

## P8 — 연속 시신 샷이 따로 논다 (S12 시신 sh8/sh10/sh13/sh14/sh15) — **가장 중요**

**증상**: 시신(부동 dynamic entity)이 여러 샷에 걸치는데 자세/위치가 샷마다 달라짐(중앙 제어 부재).

**근본원인** (메타-C; 검증으로 정밀화 — 단순 "그룹 부재"가 아님):
- **부분 그룹화는 됨**: sh8↔sh13 은 `zoom_continuity` 그룹(vca-s12-zoom-5)에 묶여 있고 그
  `locked_elements` 가 시신 자세("stiff/clenched hand","dead seated body")를 **이미 계약**함.
- **(1) 계약이 소비 안 됨**: scene_detail 의 anchor 주입 블록 `detail_steps.py:2970` 이
  **printed_prop 전용** → zoom_continuity locked_elements 를 멤버 샷 프롬프트에 주입 안 함
  ("W-C 별도 wave" 미구현). 그래서 계약된 시신 자세가 실제 생성에 안 들어감.
- **(2) 나머지 시신 샷은 그룹 자격 없음**: sh10/sh14/sh15 는 zoom 쌍이 아니라 어느 그룹에도 안 묶임.
  seed 탐지기가 둘뿐: `detect_c_seeds`(zoom_in_detail dep 쌍), `detect_d_seeds`(prop_short_id 2+ 등장,
  `visual_continuity_anchor_plan.py:166 if sid in prop_short_ids`) → **캐릭터/시신은 prop 아니므로
  영구 시드 자격 없음**.
- **(3) ref 도 자세 미보장**: character ref = (character,state)당 단 1장 정체성 초상
  (`image_steps.py:825-841` character_state_variant), 멀티샷 자세 계약 아님. prev_shot ref 는 배경
  연속(keep_elements, ignore standing people)용이고 zoom_in_detail 라벨조차 "render poses as
  described in the prompt text" 로 자세 결정권을 per-shot 텍스트에 넘김.
- **XCUT (클러스터 A)**: sh8 은 dead state_variant ref(DB 실재 c5ccf4f6…:dead 민숙)가 아니라
  **passport ID photo** 를 첨부받음 → 시신은 "정체성 ref 오선택(A)" + "자세 연속성 부재(E)" 동시 발생.

**수정방향 = 사용자 제안("관련 샷 스케치 사전 일괄생성, 중앙제어")의 generic 설계**:
사용자 제안이 들어맞는 빈 슬롯이 이미 존재(`composition_continuity_chain`,
`outdoor_site_layout_plan.py:552` 는 outdoor 좌표 전용이라 indoor 시신 미커버).

1. **[그룹 감지 = 구조 신호]** `detect_d_seeds`(prop)와 대칭으로 **dynamic-entity continuity seed**
   탐지기 추가. 시드 기준 전부 구조적:
   - 같은 character short_id 가 ≥2 selected shots 의 visible_entities 에 등장 AND
   - 그 샷들의 `staging.subject_state` 가 **immobilized** (`subject_state.py:25`
     `IMMOBILIZED_STATES={unconscious, dead, severely_injured}` — closed-world enum) AND
   - 같은 시공간(같은 scene_index + location short_id 일치)의 연속/근접 shot_index 그룹.
   → immobilized 를 게이트로 두는 이유가 generic: "자세/위치가 시간에 따라 변하면 안 되는 entity" =
     부동 상태가 enum 으로 이미 정의됨. 글자/시나리오 의존 0.
2. **[중앙 구도 사전생성]** 그룹이 성립하면 **그룹 단위로 한 번만** 공유 구도 계약 생성 — 시신 1구의
   `frame_position`/`facing`/`pose` locked_elements (필요시 outdoor 처럼 경량 좌표 또는 establishing
   샷 1장 스케치). 멤버 전 샷에 동일 주입.
3. **[계약 소비 배선]** `detail_steps.py:2970` 의 anchor 주입을 printed_prop 전용에서 확장해
   immobilized-subject 그룹(및 기존 zoom_continuity) locked_elements 도 멤버 샷 user_prompt 에 동일
   문구로 주입. + 먼저 렌더된 establishing 샷(framing_scale wide/full)을 후속 close 샷의 시각 anchor
   이미지로 첨부("keep the immobilized subject's pose/position exactly as in this reference").
4. **[A 동반]** 시신 샷이 dead state_variant ref(정체성) + 그룹 자세 계약(연속성)을 함께 받도록
   클러스터 A 의 ref 선택 수정과 묶어 진행.

**시나리오 의존 가드**: "시신/시체" 단어·특정 장면 매칭 절대 금지. character short_id 반복 + subject_state
enum(immobilized) + scene/location 동일 + shot_index 근접의 구조 신호로만 그룹 정의.

---

## 우선순위 / 다음 세션 시퀀스 (제안)

| 순위 | 문제 | 근거 | 난이도 |
|---|---|---|---|
| 1 | **P8** 시신 연속성 (+A ref 선택) | 사용자 "가장 중요", 메타-C 핵심, 영향 큼 | 높음 (신규 seed+소비 배선) |
| 2 | **P1** i2i 이름/모순 | i2i 직접 품질, 메타-A, 변경 국소(2 함수/상수) | 낮음 |
| 3 | **P3** 참조 라벨 | 메타-A 동일 뿌리, 전 샷 영향 | 중 |
| 4 | **P6** ring/disc | 메타-C, entity_detail 배선 (vca 경로 아님 주의) | 중 |
| 5 | **P2** plate fidelity 진단 | 메타-B, VLM 진단+재생성 | 중 |
| 6 | **P7** 스케치 커버리지 | P8 의 스케치 인프라와 연계 가능 | 중 |
| 7 | **P5** 모순 ref 강등 | 메타-B | 중 |
| 8 | **P4** derive anchor | 의도된 동작, 개선 여지만 | 낮음 |

- P1+P3 는 메타-A 로 함께(이름 제거 + 라벨 = 식별자 원칙). P6+P8 은 메타-C 로 인접(단계 배선 + 계약
  소비). P8 의 establishing-샷 스케치와 P7 의 난이도-스케치는 같은 "구조신호 기반 스케치 사전생성"
  인프라를 공유하도록 설계하면 중복 제거.

## 시나리오 의존 0 — 전역 체크리스트 (구현 시 필수 준수)
- 인물명/장소명/소품명/한국어 어휘를 코드·프롬프트·정규식·substring·토큰경계로 의미판정 **금지**.
- 허용 신호: `entity_type`, `framing_scale` enum, `subject_state` enum(IMMOBILIZED_STATES),
  `shot_dependency`, visible_entities 출현수/반복, geometry 좌표/bbox/심볼밀도, depth_plane enum,
  angle enum, view brief `fixed_elements`(구조 필드), zone/space 구조 데이터.
- LLM 의미판정은 evidence-backed(source_quote/confidence/reasoning) structured 출력으로만.
- 게이트보다 진단 surface + 재생성 트리거 우선(파이프라인 철학 정합).

## 부록 — 근거 출처
- 코드: `zoom_continuity_render_service.py:60-103`, `visual_continuity_anchor_plan.py:166/270`,
  `visual_continuity_anchor_provider.py:49-52/347`, `visual_continuity_anchor_step.py:104`,
  `scene_reference_service.py:106-119/150`, `prompt_service.py:312-329/358-416`,
  `entity_steps.py:608-645`, `detail_steps.py:2970-2996`, `image_steps.py:825-841`,
  `subject_state.py:25`, `outdoor_site_layout_plan.py:552`, `space_set_bg.py`(SHOT_ASSIGN_SYS).
- 데이터: llm_call_log(scene_image_gen reference_image_ids/prompt_used), 체크포인트
  (visual_continuity_anchor / zoom_continuity_anchor / shot_dependency / outdoor_site_layout /
  space_set_bg / entity_detail manifest), image_asset(reference/scene).
- 방법: 5클러스터 병렬조사 + 적대적 검증(검증이 정정한 4건: 시신 sh8↔sh13 zoom 그룹 기 묶임 /
  P5 강등 타겟 = prev-shot 최종 / P6 fix = entity_detail 경유(vca anchor 아님) / P4 = 의도된 derive).
