{
  "status": "completed",
  "completed_count": 66,
  "applicable_count": 66,
  "failed_count": 0,
  "schema_version": 7,
  "config_hash": "dc07cd5433bf681a",
  "data": {
    "scenes": [
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "허벅지에 남은 기괴한 이빨 자국",
        "representative_moment": "도망치는 C07의 허벅지에 선명하게 파인 이빨 자국과 흐르는 피",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up (ECU) low angle at knee height, shallow depth of field, cold blue-gray dusk tone with sharp crimson accent",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up low angle at knee height. Focus on a large, jagged bite mark on the exposed bare thigh of a middle-aged East Asian man. Raw tissue is visible inside the wound, with fresh blood tracking downward in sharp crimson drops against the clammy skin. The thigh muscles are tense, the leg angled toward the right in mid-stride stumbling, with the knee occupying the lower-center frame and the frayed hem of hiking pants visible just above the wound. [L01: Dense overgrown brush and wet foliage scrape across the lower and side frame edges, while the dark, muddy forest floor and soft dark verticals of tree trunks blur into a soft background behind the leg.] Cold, fading blue-gray dusk light washes over the skin, with deep, pervasive shadows swallowing the background elements.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: 허벅지에 커다란 이빨 자국. 피가 흐르고.",
              "Shot 3 description: extreme close-up low angle beside the bare thigh at knee height, bite mark sits center-left with blood drops tracking downward"
            ],
            "visual_inferences": [
              "fixed_element dusk_forest_lighting: A dense, overgrown forest environment enveloped in cold, fading blue-gray dusk light with deep, pervasive shadows",
              "Mid-stride stumbling posture applied to the leg mechanics (tense muscles, angled forward)",
              "Presence of frayed hiking pants hem to justify the exposed bare thigh while wearing the assigned outdoor outfit"
            ],
            "creative_decisions": [
              "Applied body_part_focus_rule by replacing C07O09 with a common noun and demographic descriptor to prevent floating face artifacts in the extreme close-up",
              "Cropped the rest of the body entirely to make the bleeding wound the singular focal point of panic",
              "Used L01 frame-edge descriptive block to anchor the background according to skipped_close_framing policy"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "de6baba4232b1fee",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "6aaacd9d20465357",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 3,
        "visible_entities": [
          "C07",
          "P01",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An observer's direct view holds an extreme close-up (ECU) low angle beside the 한국인 남자's bare thigh at knee height, handheld and shaking as brush scrapes across the frame edges. The bite mark sits center-left with blood drops tracking downward, while the rest of the body and forest are cropped into blurred fragments so the wound becomes the only readable point of panic.",
            "lighting_mood": "Cold blue-gray dusk light leaks through foliage, with the blood rendered as a sharp crimson accent against clammy skin.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C07",
              "P01",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C07",
                "outlook_id": "O09"
              },
              {
                "character_id": "C15",
                "outlook_id": "O15"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_forest_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, overgrown forest environment enveloped in cold, fading blue-gray dusk light. The surrounding foliage and tree trunks are partially obscured by deep, pervasive shadows, creating a chilling and eerie atmosphere.",
                "applies_to_shots": [
                  3,
                  4,
                  5
                ],
                "source_facts": [
                  "Scene text: 숲속 / 해 질 무렵 (Forest / Dusk)",
                  "Shot 3: Cold blue-gray dusk light leaks through foliage",
                  "Shot 4: Fading coastal-blue dusk",
                  "Shot 5: cold dusk tones, using the last gray sky"
                ],
                "visual_inferences": [
                  "Deep, pervasive shadows swallowing the background elements due to the extremely low light level"
                ],
                "creative_decisions": [
                  "Applying a consistent cold blue-gray color palette across extreme close-ups and wide shots to anchor the visual timeline right before nightfall"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C07O09",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C15O15",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "98876b93167416ec"
      },
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "겁에 질려 도망치는 남자",
        "representative_moment": "땀에 젖은 C07의 겁에 질린 얼굴이 프레임에 잡힌 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight eye-level handheld close-up with shallow depth of field, fading coastal-blue dusk light",
            "t2i_prompt": "Photorealistic cinematic still. Tight framing on his expression, shoulder visible at the edge. C07O09 in a neon hiking jacket, a middle-aged East Asian man, at three-quarter angle from the left, stumbling forward panting. His sweat-slick face and blown wide pupils convey breathless panic, eyes fixed on the dark trees past camera right. Cold blue-gray dusk light catches damp skin highlights, while deep pervasive shadows wrap his jawline. [L01: blurred thin swaying branches and dark forest streaks at the frame edges, shallow depth of field]",
            "outfit_assignments": [
              {
                "character_id": "C07",
                "outlook_id": "O09"
              }
            ],
            "source_facts": [
              "Scene text: 잔뜩 겁에 질린 남자 표정(T.S)",
              "Shot description: sweat-slick face, pupils blown wide, gaze snapping past camera right"
            ],
            "visual_inferences": [
              "fixed_element dusk_forest_lighting: Cold blue-gray dusk light and deep shadows",
              "Shallow depth of field blurring the background trees into streaks"
            ],
            "creative_decisions": [
              "Used 'Tight framing on his expression, shoulder visible at the edge' to comply with close_framing_face_phrasing and prevent floating-head artifact",
              "Used L01 block to strictly describe frame-edge environment without referencing the omitted chain_bg",
              "Omitted C15 entity entirely as requested"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "0fd665a4a678f638",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "0d9873c7e50d66b8",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "Shot 3의 숲속 조명과 톤 유지 (dusk_forest_lighting)",
        "_shot_index": 4,
        "visible_entities": [
          "C07",
          "P01",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An observer's direct view shifts to a face-filling close-up (CU) eye-level handheld shot from the 한국인 남자's front-left, backing away just ahead of him on the forest path. His sweat-slick face occupies nearly the whole frame, pupils blown wide and gaze snapping past camera right toward the unseen darkness, with shallow DOF turning the trees into streaks.",
            "lighting_mood": "Fading coastal-blue dusk and damp skin highlights create a cold, breathless panic, with shadows swallowing the background.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C07",
              "P01",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C07",
                "outlook_id": "O09"
              },
              {
                "character_id": "C15",
                "outlook_id": "O15"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_forest_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, overgrown forest environment enveloped in cold, fading blue-gray dusk light. The surrounding foliage and tree trunks are partially obscured by deep, pervasive shadows, creating a chilling and eerie atmosphere.",
                "applies_to_shots": [
                  3,
                  4,
                  5
                ],
                "source_facts": [
                  "Scene text: 숲속 / 해 질 무렵 (Forest / Dusk)",
                  "Shot 3: Cold blue-gray dusk light leaks through foliage",
                  "Shot 4: Fading coastal-blue dusk",
                  "Shot 5: cold dusk tones, using the last gray sky"
                ],
                "visual_inferences": [
                  "Deep, pervasive shadows swallowing the background elements due to the extremely low light level"
                ],
                "creative_decisions": [
                  "Applying a consistent cold blue-gray color palette across extreme close-ups and wide shots to anchor the visual timeline right before nightfall"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C07O09",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C15O15",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "fb5b08f9419d0736"
      },
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "공중에서 덮치는 검은 형상",
        "representative_moment": "검은 형상(C15)이 도망치던 남자(C07)를 덮치기 위해 공중으로 뛰어올라 양팔을 뻗은 찰나의 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide shot (WS) low angle from the dark clearing, static and aimed upward",
            "t2i_prompt": "Photorealistic cinematic still. A wide shot from a low angle looking upward from the muddy, uneven forest clearing ground. The environment is enveloped in cold, fading blue-gray dusk light, with deep shadows obscuring the dense tree canopy. Bursting out of the upper center of the frame against the clouded gray-blue evening sky, C15O15 in a dark tattered cloak, a humanoid figure, is captured mid-leap facing the camera, arms outstretched downward. Lit as a dark occult silhouette, rim light traces the shoulders and arms, body volume preserved against the dim ambient fill, eyes fixed on the man below. In the lower foreground, sharing the same muddy clearing, C07O09 in a bright outdoor jacket, an East Asian man, is captured with his back to the camera, recoiling heavily on his back foot, looking upward at the attacker. Focus on the airborne silhouette against the dim sky.",
            "outfit_assignments": [
              {
                "character_id": "C07",
                "outlook_id": "O09"
              },
              {
                "character_id": "C15",
                "outlook_id": "O15"
              }
            ],
            "source_facts": [
              "Scene text: 쏜살같이 달려온 검은 인영이 남자를 덮친다.",
              "shot description: black figure bursts out of upper center mid-leap, man stays small and recoils beneath"
            ],
            "visual_inferences": [
              "fixed_element dusk_forest_lighting: fading blue-gray dusk light, deep pervasive shadows",
              "low angle places the sky in the upper background to create the silhouette effect",
              "shared muddy clearing grounds the spatial relationship between the foreground victim and airborne attacker"
            ],
            "creative_decisions": [
              "rim lighting on the leaping figure to avoid a flat cutout silhouette",
              "placing the victim in the lower foreground to emphasize the attacker's dominant height and momentum"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "892da1ee79740219",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d7231eb8d11090b0",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "previous_shot_refs indicates S1_Shot4 as exact_background reference, requiring the same dusk forest environment to be maintained.",
        "_shot_index": 5,
        "visible_entities": [
          "C07",
          "C15",
          "P01",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An observer's direct view locks into a wide shot (WS) low angle from the dark clearing, static and aimed upward as 검은 형상 bursts out of the upper center of frame. The 한국인 남자 stays small and lower in the frame, recoiling beneath it, while the black figure is held at the apex of its leap as a silhouette against the dim sky.",
            "lighting_mood": "The scene is underexposed in cold dusk tones, using the last gray sky as backlight to carve the attacker into a black occult silhouette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C07",
              "C15",
              "P01",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C07",
                "outlook_id": "O09"
              },
              {
                "character_id": "C15",
                "outlook_id": "O15"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_forest_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, overgrown forest environment enveloped in cold, fading blue-gray dusk light. The surrounding foliage and tree trunks are partially obscured by deep, pervasive shadows, creating a chilling and eerie atmosphere.",
                "applies_to_shots": [
                  3,
                  4,
                  5
                ],
                "source_facts": [
                  "Scene text: 숲속 / 해 질 무렵 (Forest / Dusk)",
                  "Shot 3: Cold blue-gray dusk light leaks through foliage",
                  "Shot 4: Fading coastal-blue dusk",
                  "Shot 5: cold dusk tones, using the last gray sky"
                ],
                "visual_inferences": [
                  "Deep, pervasive shadows swallowing the background elements due to the extremely low light level"
                ],
                "creative_decisions": [
                  "Applying a consistent cold blue-gray color palette across extreme close-ups and wide shots to anchor the visual timeline right before nightfall"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C07O09",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C15O15",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "9d062b0ddd86aa82"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "흡혈 직전의 붉은 눈과 목덜미",
        "representative_moment": "C08의 이빨이 창백한 여자의 목 피부에 닿는 정지 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight head-and-shoulder side profile, shallow depth of field focusing strictly on the neck contact point.",
            "t2i_prompt": "Photorealistic cinematic still. Tight head-and-shoulder composition from an eye-level side angle. C08O10 in a dark hood, a young East Asian man, occupies the right side in right profile, his shoulder in frame, his dark red eyes fixed on the pale throat before him. Focus on his open mouth as his teeth touch her pale skin dead center. An East Asian woman is positioned on the left in left profile, her head tilted back and her eyes looking up, her features softened by shallow depth of field so the sharp focus remains on the contact point between his jaw and her neck. Sickly sodium-green light reflects on their skin, creating a cold, corpse-like tone against deep blue-black shadows. [L03: The background is completely dissolved into abstract yellow-green streetlight bokeh and soft vertical darkness].",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O10"
              }
            ],
            "source_facts": [
              "Scene text: '격렬하게 흡입하는 소리로 바뀌고 남자의 붉은 눈동자, 목의 살점을 뜯는 이빨'",
              "Shot 4 description: '한국인 남자의 치아가 여자의 핏기 없는 목 피부에 닿은 정지 순간.'"
            ],
            "visual_inferences": [
              "The woman's identity (C09O11) is excluded per the modification request, rendering her as a common unregistered entity.",
              "To comply with the single sharp face rule in close-ups, the woman's face is rendered soft and out of focus, preserving the focus entirely on the man's mouth and her throat."
            ],
            "creative_decisions": [
              "Adjusted the extreme close-up to a 'tight head-and-shoulder composition' to ensure the T2I model does not generate a floating, detached head when C08O10 face ref is injected.",
              "Abstracted the background completely into bokeh per the 'skipped_close_framing' background binding rule, avoiding any reference to the specific existing room layout."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "747662ec070c4a8a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "e80ec516404894be",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "None",
        "_shot_index": 4,
        "visible_entities": [
          "C08",
          "L03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An observer's direct view freezes into an extreme close-up (ECU) eye-level side profile at neck height, only inches from the 한국인 여자's pale throat and the 한국인 남자's mouth. The teeth touch skin at dead center, with the background dissolved into abstract streetlight bokeh and the frame held almost unnaturally still.",
            "lighting_mood": "Sickly sodium-green alley light grazes the skin, making the bloodless neck cold and corpse-like before the crimson break.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08",
              "L03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O10"
              },
              {
                "character_id": "C09",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wet_alleyway_night",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A cold, dark city alleyway at night. The space is illuminated by weak, sickly sodium-green and muted fluorescent streetlights, casting a gloomy and chilling atmosphere. The ground consists of wet, dark pavement reflecting the dim urban light.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "Scene text: '도시 뒷골목 / N', '도심 희미한 가로등 불빛'",
                  "Shot 4: 'Sickly sodium-green alley light grazes the skin'",
                  "Shot 5: 'wet pavement and trash-lined walls', 'Muted blue-black night tones mix with weak fluorescent street spill'"
                ],
                "visual_inferences": [
                  "The overall dampness and wet pavement persist throughout the scene, even when blurred in the close-up shot."
                ],
                "creative_decisions": [
                  "Anchoring the color palette to a mix of sickly sodium-green and muted blue-black to unify the extreme close-up and the wide shot under the same eerie urban night atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O10",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C09O11",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "720ec68ad96204f9"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "쓰러진 여자와 남겨진 상흔",
        "representative_moment": "뒷골목 바닥에 쓰러져 미동 없는 C09의 목에 선명한 핏자국이 남은 전신 뷰.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle wide shot from ground level, muted blue-black night tones with weak fluorescent spill",
            "t2i_prompt": "Photorealistic cinematic still. Low camera at ground level, the wet pavement filling the lower frame. C09O11 in a stained white blouse, a young East Asian woman, lying motionless on the alley floor at a three-quarter angle from the right, with eyes closed. Her body stretches across the center, the fresh bloody wound on her neck forming a sharp red visual anchor. The location is a cold, dark city alleyway at night. Muted blue-black night tones mix with weak, sickly fluorescent street spill washing over the stained gray concrete walls and reflecting on the damp ground beneath her. Discarded trash bags rest against the walls, creating cold negative space around the figure.",
            "outfit_assignments": [
              {
                "character_id": "C09",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "Scene text: '푹 힘없이 쓰러지는 여자.'",
              "Shot 5 description: '목에 피를 흘린 한국인 여자가 눈을 감은 채 차가운 뒷골목 바닥에 쓰러져 멈춘 전신 구도.'",
              "DP instruction: 'wide shot (WS) low angle from ground level... full body lies across the center of the alley floor. Her neck wound remains the visual anchor'"
            ],
            "visual_inferences": [
              "fixed_element 'wet_alleyway_night' applies: damp pavement reflecting urban light, cold atmosphere.",
              "To satisfy the low ground-level camera and full-body requirement, the camera is positioned to show her stretched across the midground with the floor dominating the foreground."
            ],
            "creative_decisions": [
              "Emphasized the sharp red tone of the blood on her neck against the muted blue-black and sickly green ambient light to heighten the eerie horror mood.",
              "Placed discarded trash bags at the frame edges to build realistic urban grit and frame the negative space around the body."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "f19e6265f1383971",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9b5c8fad97d94811",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 2,
        "dependency_reason": "같은 공간(도시 뒷골목)에서 일어난 직전 상황(S2_Shot4)의 배경 연속성을 유지하기 위해 환경 요소를 공유.",
        "_shot_index": 5,
        "visible_entities": [
          "C09",
          "L03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An observer's direct view pulls back into a wide shot (WS) low angle from ground level, dollying away until the 한국인 여자's full body lies across the center of the alley floor. Her neck wound remains the visual anchor near the upper third of her body, while wet pavement and trash-lined walls stretch around her as cold negative space.",
            "lighting_mood": "Muted blue-black night tones mix with weak fluorescent street spill, leaving the blood at her neck as the only sharp red note.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C09",
              "L03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O10"
              },
              {
                "character_id": "C09",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wet_alleyway_night",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A cold, dark city alleyway at night. The space is illuminated by weak, sickly sodium-green and muted fluorescent streetlights, casting a gloomy and chilling atmosphere. The ground consists of wet, dark pavement reflecting the dim urban light.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "Scene text: '도시 뒷골목 / N', '도심 희미한 가로등 불빛'",
                  "Shot 4: 'Sickly sodium-green alley light grazes the skin'",
                  "Shot 5: 'wet pavement and trash-lined walls', 'Muted blue-black night tones mix with weak fluorescent street spill'"
                ],
                "visual_inferences": [
                  "The overall dampness and wet pavement persist throughout the scene, even when blurred in the close-up shot."
                ],
                "creative_decisions": [
                  "Anchoring the color palette to a mix of sickly sodium-green and muted blue-black to unify the extreme close-up and the wide shot under the same eerie urban night atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 2,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O10",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C09O11",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e886df3821db8f2c"
      },
      {
        "scene_index": 3,
        "heading": "S#3. 현장 / D",
        "beat_title": "현장 감식과 변사체 흔적",
        "representative_moment": "C02가 바닥의 검붉은 핏자국을 응시하며 턱을 괴고 있는 서늘한 관찰자 시점 구도.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium close-up angled slightly down, muted grays and desaturated greens",
            "t2i_prompt": "Photorealistic cinematic still. A broadcast-news observer view, medium close-up angled slightly down from beside the subject. Head-and-shoulder composition. C02O03 in a gray leather jacket, a middle-aged East Asian woman, occupies the right middle ground at a three-quarter angle from the right. Her chin rests heavily on her fist, eyes fixed down on a dark red-black bloodstain that anchors the lower left of the frame. Focus on the tense space between her face and the stain. Flat overcast daylight filtered through fog washes over her features, casting muted grays and desaturated greens that create a cold, forensic stillness. [L02: damp, muddy forest floor occupying the lower frame edge]. Behind her, a stretched P02 yellow police line and faintly moving blurred forensic officers are softened in the hazy background.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#3. 현장 / D: 경찰, 폴리스 라인을 치고 시신을 수거한다.",
              "S#3. 혜수의 모습이 보인다.",
              "shot description: 혜수가 턱을 괸 채 바닥의 검붉은 핏자국을 응시하는 정지 구도"
            ],
            "visual_inferences": [
              "flat overcast daylight filtered through dense fog",
              "damp, muddy forest floor holding the bloodstain",
              "blurred forensic activity behind the stretched police line"
            ],
            "creative_decisions": [
              "head-and-shoulder composition to tightly link Hye-su's face and the bloodstain in a single MCU frame",
              "muted grays and desaturated greens applied to the lighting to evoke a cold, forensic, broadcast-news atmosphere without literal UI overlays"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "ef4dae12565b01e9",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "aebd9b965ca5cfa2",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "특정 이전 샷에 종속되지 않은 독립적인 현장 스케치 및 인물 포커스 단일 컷",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "P02",
          "P03",
          "L02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A broadcast-news observer view holds a medium close-up (MCU) high angle from low beside 혜수, locked off about one meter away and angled slightly down so her chin-resting profile and the bloodstain share the frame. 혜수 occupies the right middle ground, the dark red-black stain anchors the lower left, and hazy police activity remains softened behind the line.",
            "lighting_mood": "Flat overcast daylight is filtered through fog, with muted grays and desaturated greens giving the news image a cold, forensic stillness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "P02",
              "P03",
              "L02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "db8a52a656f4bcd1"
      },
      {
        "scene_index": 4,
        "heading": "S#4. 옥탑방 / D",
        "beat_title": "불안감이 감도는 인천 변두리 옥탑방 전경",
        "representative_moment": "흐린 회색빛 하늘 아래 낡은 옥탑방과 파란 물탱크가 내려다보이는 스산한 부감 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme wide shot, high oblique aerial view, diffuse gray daylight, muted concrete grays and blues",
            "t2i_prompt": "Photorealistic cinematic still. Extreme wide shot, high oblique aerial angle looking down. [L04: A weathered suburban villa rooftop room positioned slightly right of center.] The faded blue water tank from the reference sits on the uneven, stained tile roof. Diffuse gray daylight from a low overcast sky washes over the scene, flattening the cluttered neighboring rooflines into muted concrete grays and dull blues. Focus on the faded blue water tank from the reference standing ominously amidst the desolate stillness of the roof terrace.",
            "outfit_assignments": [],
            "source_facts": [
              "S#4 action: 기자(E) voiceover about rumors and fear",
              "shot description: high angle view of an old villa rooftop in Incheon, blue water tank, overcast sky",
              "no visible characters in the frame"
            ],
            "visual_inferences": [
              "The voiceover implies an ominous and isolated atmosphere, visually represented by the empty rooftop",
              "Diffuse lighting flattens the textures to emphasize bleakness"
            ],
            "creative_decisions": [
              "Anchored the water tank and roof terrace to the reference to maintain background binding",
              "Placed the main rooftop room slightly right of center to match DP instructions for the extreme wide shot composition"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "8e8e482a945556d2",
              "owned_hash": "c9ee8c218343e53d",
              "camera_direction_hash": "84e6d0b7360fb128",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "water tank",
                  "violating_phrase": "The faded blue water tank from the reference",
                  "reason": "The phrase explicitly references the existing water tank from the reference, which is an anchor/reference mention rather than a request to create or redraw it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "water tank",
                  "violating_phrase": "the faded blue water tank from the reference standing ominously",
                  "reason": "This is a descriptive reference to the already-present water tank, with no explicit redraw verb applied to it.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "voiceover",
        "dependent_scene_index": -1,
        "dependency_reason": "독립적인 공간을 묘사하는 전경(Establishing) 샷이므로 이전 샷과의 시각적 의존성이 없음",
        "_shot_index": 1,
        "visible_entities": [
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 4,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An omniscient direct view settles into an extreme wide shot (EWS) high angle from a high oblique aerial position above the Incheon villa rooftops. The worn rooftop room sits slightly right of center, its old tile roof and blue water tank held in a static frame with enough surrounding gray sky and neighboring rooflines to make it feel isolated.",
            "lighting_mood": "Diffuse gray daylight flattens the buildings into muted blues and concrete grays, making the water tank's faded blue feel strangely ominous.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L04"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_rooftop_day_overcast_establishing",
            "reference_usage": "exact_background",
            "owned_objects": [
              "access door",
              "laundry line",
              "parapet wall",
              "post",
              "roof drain",
              "roof terrace",
              "sliding window",
              "stairwell",
              "wall light",
              "water tank",
              "window sill"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "bg_rooftop_day_overcast_establishing",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "de06949218c8423d"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "불안한 TV 시청",
        "representative_moment": "민숙(C05)이 끓는 약초물 수증기를 등지고 서서 살인 사건 뉴스를 굳은 표정으로 바라보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up (CU) eye-level frontal portrait, sick TV-blue spill mixed with hazy pale window light",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition, tight framing on the face of C05O06 in an apron over a beige cardigan, a middle-aged East Asian woman, facing the camera. Her eyes are fixed on a glowing television screen just off-camera to her eyeline, her expression dark and tense. Her shoulders are tight beneath the apron, knuckles lightly gripping the apron hem visible at the very lower edge of the frame. Focus on her anxious eyes reflecting the screen's pale glow. Sickly blue light from the television washes over the front of her face and chest, draining her complexion into an anxious gray, while pale natural light falls softly on her opposite shoulder. The space directly behind her is a soft, out-of-focus backdrop [L07: dim pale daylight passing through a minimized small window, completely enveloped in a continuous soft, misty haze of steam rising from a recently boiled pot, creating a muted and hazy domestic atmosphere].",
            "outfit_assignments": [
              {
                "character_id": "C05",
                "outlook_id": "O06"
              }
            ],
            "source_facts": [
              "S#5 action: '앞치마를 두른 채 TV 뉴스를 뚫어지게 바라보는 민숙 표정이 어둡다.'",
              "Shot 4 description: observer's direct view pushes into a close-up frontal portrait, keeping the TV just off her eyeline",
              "Shot 4 lighting: sickly TV-blue spill draining her face into anxious gray"
            ],
            "visual_inferences": [
              "fixed_element steamy_kitchen_background: soft misty haze from boiling pot permeates the immediate background",
              "tension expressed through tight shoulders and gripping the apron hem",
              "head-and-shoulder composition avoids floating head artifact while maintaining close-up intimacy"
            ],
            "creative_decisions": [
              "applied blue light spill softly washing over the face surface rather than cutting across, preventing T2I slicing artifacts",
              "background binding skipped_close_framing: omitted detailed room layout and kept only the frame-edge hazy steam and pale window light as [L07]"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "96904185fce406e5",
              "owned_hash": "cb1d462ffc515e90",
              "camera_direction_hash": "23afcc72051db611",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 4,
        "visible_entities": [
          "C05",
          "P04",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An observer's direct view pushes into a close-up (CU) eye-level frontal portrait of 40대 한국인 여성 from the living-room side, keeping the TV just off her eyeline rather than visible head-on. Her face fills most of the center frame, shoulders tight beneath the apron, while the sink steam and small window are minimized into soft domestic haze behind her.",
            "lighting_mood": "Pale window light mixes with sickly TV-blue spill, draining her face into anxious gray while the kitchen steam softens the room.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C05",
              "P04",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_day_normal",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "steamy_kitchen_background",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The kitchen sink area is enveloped in a soft, misty haze of steam rising from a recently boiled pot. The surrounding space is dimly lit by pale natural light from a small window, creating a muted, slightly hazy domestic atmosphere in the background.",
                "applies_to_shots": [
                  4,
                  9
                ],
                "source_facts": [
                  "S#5 scene text: 냄비의 물이 끓어 달그락거리는 소리… 김이 피어오르고",
                  "Shot 4 description: sink steam and small window are minimized into soft domestic haze behind her",
                  "Shot 9 description: blurred sink and shut-off TV behind her... leftover kitchen steam create a muted domestic calm"
                ],
                "visual_inferences": [
                  "The steam from the boiling medicinal herbs consistently permeates the kitchen area, visibly affecting the background clarity and atmosphere."
                ],
                "creative_decisions": [
                  "Using the lingering steam as a continuous environmental texture to spatially connect the separate close-up shots of the mother and daughter."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "2cec06233eb02d92"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "약초물을 마시며 투덜거리는 수리영",
        "representative_moment": "C01이 얼굴을 찡그린 채 입술에 댄 컵 안의 약초물을 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close-up (CU) three-quarter angle, soft gray daylight.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in gray homewear, a young East Asian woman, at a three-quarter angle from the left, head and shoulders in frame. A small cup filled with faint medicinal brown-green herbal water rests against her lips in the lower center of the frame, the rim angled toward the camera. Her eyes are fixed on the cup, showing a slight frown and narrowed eyes. Focus on her expression, tight framing on her face with her upper chest visible. Soft gray daylight reflects on her cheek, creating a muted domestic calm. [L07: A heavily blurred background featuring a dark, shut-off TV screen and a soft, misty haze of steam rising in the dim space behind her].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S#5 scene text: (석창포 달인 물을 따라주면서) 마셔. 방학인데 왜 더 자지않고. (마시고 나서) 아, 진짜 맛 없어...(투정)",
              "Shot 9 description: Close-up of 수리영 at the dining table, cup rests against her lips, slight frown and narrowed eyes, blurred sink and shut-off TV behind her."
            ],
            "visual_inferences": [
              "fixed_element steamy_kitchen_background: soft, misty haze of steam rising from a recently boiled pot, dimly lit by pale natural light",
              "She hasn't changed clothes yet in this moment (before the 'cut to' action), so she is in homewear."
            ],
            "creative_decisions": [
              "Tight framing with shoulders and chest in frame to avoid the floating head effect (close framing face rule).",
              "Used heavy background blur and steam to emphasize her facial expression while skipping the explicit room reference, conforming to close framing constraints."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "acc264664f80a9dc",
              "owned_hash": "cb1d462ffc515e90",
              "camera_direction_hash": "8dc827d854edf684",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "Continuity: maintains the soft, misty haze of kitchen steam established in S5_Shot4 as a background environmental texture.",
        "_shot_index": 9,
        "visible_entities": [
          "C01",
          "P04",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An observer's direct view resolves the table dolly into a close-up (CU) eye-level three-quarter angle on 수리영 at the dining table. The cup rests against her lips in the lower center of frame, taking less than a third of the image, while her slight frown and narrowed eyes hold focus against a blurred sink and shut-off TV behind her.",
            "lighting_mood": "Soft gray daylight and leftover kitchen steam create a muted domestic calm, with the herbal water tinted a faint medicinal brown-green.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P04",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_day_normal",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "steamy_kitchen_background",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The kitchen sink area is enveloped in a soft, misty haze of steam rising from a recently boiled pot. The surrounding space is dimly lit by pale natural light from a small window, creating a muted, slightly hazy domestic atmosphere in the background.",
                "applies_to_shots": [
                  4,
                  9
                ],
                "source_facts": [
                  "S#5 scene text: 냄비의 물이 끓어 달그락거리는 소리… 김이 피어오르고",
                  "Shot 4 description: sink steam and small window are minimized into soft domestic haze behind her",
                  "Shot 9 description: blurred sink and shut-off TV behind her... leftover kitchen steam create a muted domestic calm"
                ],
                "visual_inferences": [
                  "The steam from the boiling medicinal herbs consistently permeates the kitchen area, visibly affecting the background clarity and atmosphere."
                ],
                "creative_decisions": [
                  "Using the lingering steam as a continuous environmental texture to spatially connect the separate close-up shots of the mother and daughter."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "29ed7ffd61db873a"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "손목의 선명한 표식",
        "representative_moment": "수리영이 나갈 채비를 하던 중, 민숙의 손목에 붉게 도드라진 작은 원형 표식을 보게 된다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up (CU) high angle, tight focus on the wrist mark, dim daylight fading into bluish shadow",
            "t2i_prompt": "Photorealistic cinematic still. Close-up high angle looking down at the bare wrist of a middle-aged East Asian woman. The wrist is lowered and angled diagonally across the frame, the sleeve cuff slightly pushed back. Focus on a small circular mark just right of center on the skin, holding a faint red tint. Dim indoor daylight falls off into bluish entryway shadow, making the crimson mark feel unnaturally vivid against the skin. The background is a soft out-of-focus plane showing a worn entryway floor beneath the hand, with the blurred side of a shoe rack barely visible at the edge of the frame.",
            "outfit_assignments": [],
            "source_facts": [
              "S#5 action: '힐끗, 민숙 손목에 보이는 작은 원(이하 표식)을 본다. 오늘따라 유난히 또렷해 보이지만'",
              "shot description: A close-up of a bare wrist belonging to a 40-something Korean woman, with a faint red circular mark clearly visible on the skin."
            ],
            "visual_inferences": [
              "wrist lowered near chest level, angled diagonally",
              "sleeve slightly pushed back to reveal the mark",
              "dim indoor daylight creating a bluish entryway shadow"
            ],
            "creative_decisions": [
              "tight high-angle framing to isolate the wrist against the soft out-of-focus entryway floor",
              "faint red tint contrasting with bluish shadows to highlight the supernatural occult element within an ordinary space",
              "applied body_part_focus_rule by replacing C05O06 with a common noun and demographic descriptor"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a405d1993dfed2ab",
              "owned_hash": "cb1d462ffc515e90",
              "camera_direction_hash": "d02853eff15fec09",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "zoom_in_detail of Min-sook's wrist from the prior interaction in the same entryway space, focusing purely on the mark",
        "_shot_index": 14,
        "visible_entities": [
          "P04",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "An observer's direct view drops into a close-up (CU) high angle from beside 40대 한국인 여성 at chest-to-waist height, angled down onto her bare wrist as the dolly-in settles. The small circular mark sits just right of center on the skin with a faint red glow, while the edge of her sleeve and the entryway floor remain visible as scale references.",
            "lighting_mood": "Dim indoor daylight falls off into bluish entryway shadow, making the mark's crimson tint feel unnaturally vivid against ordinary skin.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P04",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_day_normal",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 9,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "7950d7d661b86493"
      },
      {
        "scene_index": 6,
        "heading": "S#6. 해안가 도로 / D",
        "beat_title": "바닷바람을 맞으며 달리는 수리영",
        "representative_moment": "하얀 이어폰을 끼고 눈을 지그시 감은 채 자전거를 타는 C01의 옆얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight eye-level tracking close-up, right-aligned composition, muted blue-gray cold daylight",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a navy windbreaker, a young East Asian woman, in left profile, leaning slightly forward into the ride. Tight eye-level framing on her calm side-profile, shoulder and neck visible in the frame, occupying the right half of the composition. Focus on her closed eyelids and the white earphones resting in her ears. Her hair gently flows back in the direction opposite to motion, while a slice of the bicycle handlebar enters the lower frame edge, slightly blurred to imply forward motion. Lit by cold coastal daylight diffused through sea fog, pale blue-gray softness washing her skin. [L08: muted blue-gray bokeh of a foggy coastal road and sea receding laterally behind her, hazy and out-of-focus].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot description: Close-up of Suri-young's side profile, white earphones in both ears, eyes gently closed.",
              "DP instruction: tracking parallel from left side, right half of frame, foggy coastal road and sea smear into bokeh.",
              "Action: riding a bicycle, inhaling the sea scent."
            ],
            "visual_inferences": [
              "hair flowing back to indicate forward motion in mid-ride",
              "bicycle handlebar partially visible at the bottom edge to anchor the riding action within a close frame"
            ],
            "creative_decisions": [
              "placed the character in the right half of the frame to provide leading room for the implied forward motion",
              "applied pale blue-gray light washing the skin to emphasize the cold, premonitory sea fog atmosphere"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "0fa4e8f7484a9a7e",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9c82441cf3ab8c61",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "해안가를 달리는 단독 액션 컷으로, 앞선 특정 샷의 공간적·시각적 요소에 직접적으로 의존하지 않음.",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 6,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision. A tight eye-level CU tracks parallel about two feet from 수리영's left side, holding her calm side-profile in the right half of frame while both white earphones and her closed eyelids stay crisp; the bicycle motion is implied only by a faint tremor at the frame edge. The foggy coastal road and sea smear into muted blue-gray bokeh behind her, with no independent camera shift beyond the flow’s close side observation.",
            "lighting_mood": "Cold coastal daylight is diffused through sea fog, washing her skin in pale blue-gray softness with a quiet, almost premonitory calm.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "8d5fbc1a693fbfa9"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "사납게 짖는 맹견",
        "representative_moment": "C11이 철장 너머로 사납게 이빨을 드러내며 짖고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle close-up through foreground bars, sterile fluorescent lighting",
            "t2i_prompt": "Photorealistic cinematic still. Low angle close-up at muzzle height. C11O00, a huge black Rottweiler, facing the camera, its massive head pushing aggressively forward. Focus on the snarling expression, with open jaws, wet black nose, and exposed teeth occupying the center of the frame, eyes fixed on the camera. Thick, vertical metallic cage bars cross the immediate foreground, acting as a stark physical barrier right in front of the muzzle. Harsh overhead fluorescent light casts a cool, sterile green-gray wash, catching sharp highlights on the wet teeth, black fur, and saliva. [L09: cramped kennel interior with a slice of dark, stained concrete floor visible directly behind the dog].",
            "outfit_assignments": [
              {
                "character_id": "C11",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "Shot 1 description: '철장 안에서 이빨을 거칠게 드러내고 입을 벌린 거대한 검은색 로트와일러의 머리.'",
              "Camera direction: 'Observer perspective... low angle CU sits at muzzle height... vertical cage bars slice the foreground.'"
            ],
            "visual_inferences": [
              "fixed_element kennel_cage_bars: Thick, vertical metallic cage bars form the animal enclosure.",
              "fixed_element sterile_fluorescent_lighting: harsh overhead fluorescent lights, casting a cool, waxy, green-gray wash.",
              "Saliva and wet fur textures emphasize the aggressive, feral state."
            ],
            "creative_decisions": [
              "Close framing with bars in the extreme foreground to create a claustrophobic, through-bars composition.",
              "Green-gray tint to the lighting enhances the sickly, tense atmosphere of the shelter."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "dbf59aa4bcde3d38",
              "owned_hash": "24cb3d73858cd4a8",
              "camera_direction_hash": "0c33098dee57ef72",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "None",
        "_shot_index": 1,
        "visible_entities": [
          "C11",
          "L09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision from just inside the kennel gate. A low angle CU sits at the 로트와일러’s muzzle height, tighter than the flow default so the open jaws, wet black nose, and exposed teeth occupy most of the center while vertical cage bars slice the foreground without exceeding the frame. The dog’s head pushes toward camera as a through-bars composition, making the kennel feel too narrow and immediate.",
            "lighting_mood": "Sickly shelter fluorescents flicker over black fur and saliva, leaving the kennel corners in green-gray shadow with harsh highlights on the teeth.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C11",
              "L09"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C11",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_kennel_aisle_day_vaccination_busy",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "kennel_cage_bars",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Thick, vertical metallic cage bars divide the space, acting as a stark architectural element that forms the animal enclosure. The dull metal surfaces create a rigid vertical pattern that visually separates the subjects.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "source_facts": [
                  "Shot 1 description: 'vertical cage bars slice the foreground without exceeding the frame.'",
                  "Shot 4 description: 'The kennel bars are now a soft peripheral pattern'"
                ],
                "visual_inferences": [
                  "Heavy-duty steel or aluminum bars with a slightly worn metallic finish, typical of enclosures holding large aggressive dogs."
                ],
                "creative_decisions": [
                  "Maintaining the vertical bars across both shots to establish the physical barrier of the kennel, while shifting their depth of field from foreground to background to match the camera's focus."
                ],
                "confidence": "high"
              },
              {
                "element_id": "sterile_fluorescent_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior is illuminated by harsh overhead fluorescent lights, casting a cool, sterile wash with subtle waxy, green-gray tones across the surfaces. This lighting creates an unglamorous and slightly unnerving clinical atmosphere uniformly throughout the facility.",
                "applies_to_shots": [
                  1,
                  4,
                  8
                ],
                "source_facts": [
                  "Shot 1: 'Sickly shelter fluorescents flicker... leaving the kennel corners in green-gray shadow.'",
                  "Shot 4: 'Flat fluorescent light turns the fur and skin waxy, with a faint green cast.'",
                  "Shot 8: 'Cool fluorescent wash reflects off water and steel... tender but still sterile.'"
                ],
                "visual_inferences": [
                  "Industrial fluorescent tube lighting mounted on the shelter ceiling, emitting a consistently harsh spectrum."
                ],
                "creative_decisions": [
                  "Using the consistent cool, green-tinted lighting to visually unify the different areas of the shelter (the kennel and the bathing station), reinforcing an unglamorous mood."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C11O00",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "a38ca704fde925fc"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "얌전해진 맹견과 주사",
        "representative_moment": "50대 수의사의 손이 얌전해진 로트와일러의 엉덩이에 주사기를 찌르는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up with a slight Dutch angle, positioned low beside the prone dog's rear flank, isolating the syringe needle and hand in the center.",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up with a slight Dutch angle, positioned low. Focus on the rough hand of a middle-aged East Asian man holding a syringe steady and pressing the needle into the pinched skin on the rear flank of a prone Rottweiler dog. The dog's thick black fur provides scale around the outer edges of the frame. Flat fluorescent light washes the hand and fur with a waxy, faintly green-gray cast, creating an unnervingly surgical and clinical mood. [L09: A soft peripheral pattern of thick vertical metallic cage bars receding out of focus, with a sliver of damp, scuffed concrete floor visible at the lower frame edge.]",
            "outfit_assignments": [],
            "source_facts": [
              "S#7 action: '맹견의 엉덩이에 주사를 놓고 빠지는 50대 의사'",
              "shot description: '엎드린 개의 엉덩이에 주사기 바늘을 꽂은 50대 한국인 남성의 손 클로즈업.'"
            ],
            "visual_inferences": [
              "fixed_element kennel_cage_bars: integrated as a soft peripheral pattern in the out-of-focus background.",
              "fixed_element sterile_fluorescent_lighting: creates a waxy, faintly green-gray cast over the skin and fur.",
              "Focus on body part (hand and syringe) prohibits the use of character composite IDs, replaced with common noun and demographic descriptor."
            ],
            "creative_decisions": [
              "Slight Dutch angle and low camera placement to emphasize the proximity and raw tension of the medical injection.",
              "Waxy, green-tinted lighting enhances the unglamorous, clinical tone of the animal shelter."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d59251b1f87abf3c",
              "owned_hash": "24cb3d73858cd4a8",
              "camera_direction_hash": "a15e56e9b1456eba",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "S7_Shot1 (same space, zoom-in to focus on the injection detail, preserving fluorescent lighting and kennel bars in the periphery)",
        "_shot_index": 4,
        "visible_entities": [
          "L09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision continuing the lateral medical-action flow. An ECU with a slight Dutch angle pushes in low beside the prone dog’s rear flank, isolating the syringe needle, pinched skin, and 50대 한국인 남성’s rough hand in the central third while the dog’s fur provides scale around the edges. The kennel bars are now a soft peripheral pattern, keeping the action grounded without pulling focus from the injection point.",
            "lighting_mood": "Flat fluorescent light turns the fur and skin waxy, with a faint green cast that makes the routine injection feel unnervingly surgical.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L09"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C11",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_kennel_aisle_day_vaccination_busy",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "kennel_cage_bars",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Thick, vertical metallic cage bars divide the space, acting as a stark architectural element that forms the animal enclosure. The dull metal surfaces create a rigid vertical pattern that visually separates the subjects.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "source_facts": [
                  "Shot 1 description: 'vertical cage bars slice the foreground without exceeding the frame.'",
                  "Shot 4 description: 'The kennel bars are now a soft peripheral pattern'"
                ],
                "visual_inferences": [
                  "Heavy-duty steel or aluminum bars with a slightly worn metallic finish, typical of enclosures holding large aggressive dogs."
                ],
                "creative_decisions": [
                  "Maintaining the vertical bars across both shots to establish the physical barrier of the kennel, while shifting their depth of field from foreground to background to match the camera's focus."
                ],
                "confidence": "high"
              },
              {
                "element_id": "sterile_fluorescent_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior is illuminated by harsh overhead fluorescent lights, casting a cool, sterile wash with subtle waxy, green-gray tones across the surfaces. This lighting creates an unglamorous and slightly unnerving clinical atmosphere uniformly throughout the facility.",
                "applies_to_shots": [
                  1,
                  4,
                  8
                ],
                "source_facts": [
                  "Shot 1: 'Sickly shelter fluorescents flicker... leaving the kennel corners in green-gray shadow.'",
                  "Shot 4: 'Flat fluorescent light turns the fur and skin waxy, with a faint green cast.'",
                  "Shot 8: 'Cool fluorescent wash reflects off water and steel... tender but still sterile.'"
                ],
                "visual_inferences": [
                  "Industrial fluorescent tube lighting mounted on the shelter ceiling, emitting a consistently harsh spectrum."
                ],
                "creative_decisions": [
                  "Using the consistent cool, green-tinted lighting to visually unify the different areas of the shelter (the kennel and the bathing station), reinforcing an unglamorous mood."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C11O00",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "f59192ed301e6bbb"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "수리영의 능숙한 보호원 작업",
        "representative_moment": "C01 washes a small puppy in the tub, her hands resting symmetrically on its foamy back under cool fluorescent light.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Observer perspective, slightly overhead medium shot, cool fluorescent wash with subtle waxy green-gray tones",
            "t2i_prompt": "Photorealistic cinematic still. Observer perspective, slightly overhead medium shot holding static above the bathing station. Focus on a small puppy covered in fresh white soap foam in the center of the frame. C01O02 in a navy windbreaker, a young East Asian woman, her head and shoulders occupying the upper-center frame, looking down at the puppy. Her two hands are placed symmetrically from left and right on the puppy's wet back, her forearms framing the dog without overwhelming the composition. The puppy stands inside the wet tub from the reference, water streaks trailing across the stainless surface. A sprayer from the reference rests at the rear edge, wet but not running, its coiled nozzle pointing away from the camera. The space is illuminated by the fluorescent light from the reference, casting a cool, sterile wash with subtle waxy, green-gray tones. The cool fluorescent wash reflects off the water and steel, softened by the white foam, while a pale, damp tile wall forms the background.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#7 action: 달려가 털깍고, 연고 바르고, 목욕시키고 등",
              "shot description: 수리영이 작은 강아지의 젖은 등에 비누 거품을 묻힌 채 양손을 얹은 정지 구도"
            ],
            "visual_inferences": [
              "fixed_element sterile_fluorescent_lighting: harsh overhead fluorescent lights, casting a cool, sterile wash with subtle waxy, green-gray tones",
              "overhead medium composition to capture her hands symmetrically framing the puppy while keeping her upper body consistently in frame"
            ],
            "creative_decisions": [
              "Used 'the tub from the reference', 'sprayer from the reference', and 'fluorescent light from the reference' to strictly anchor background binding to the exact prior room",
              "Softened the cool horror lighting palette with the white foam to emphasize the tender shift in scene rhythm",
              "Targeted the focus specifically on the puppy to safely avoid the isolated body-part id_policy trigger while still showcasing the hands framing the subject"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "9768712b097dc97a",
              "owned_hash": "bc6a99e389261123",
              "camera_direction_hash": "0a3525d363e46e4e",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "tub",
                  "violating_phrase": "the wet tub from the reference",
                  "reason": "The prompt references the existing tub from the reference without asking to create or modify it, so this is an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sprayer",
                  "violating_phrase": "A sprayer from the reference rests",
                  "reason": "The sprayer is mentioned as already present from the reference, which is an anchor reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "the fluorescent light from the reference",
                  "reason": "The light is described as coming from the reference and used as scene lighting, not as a newly created object.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "Shot 4의 유기견 보호원 공간(background)과 차가운 형광등 조명(fixed_elements) 연속성 유지",
        "_shot_index": 8,
        "visible_entities": [
          "C01",
          "L09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision at the end of the care-close-observation flow. A slightly overhead MS detail holds static at arm level above the bathing station, with 수리영’s two hands placed symmetrically from left and right on the small puppy’s foamy wet back in the center; her forearms frame the dog without letting any prop overwhelm the image. The composition settles into a quiet long-take implied pause, shifting the scene’s rhythm from threat to care.",
            "lighting_mood": "Cool fluorescent wash reflects off water and steel, softened by white foam so the horror palette briefly becomes tender but still sterile.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L09"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C11",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_wash_grooming_area_day_bathing",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bottle",
              "counter",
              "door",
              "drain",
              "dryer blower",
              "drying rack",
              "faucet",
              "fluorescent light",
              "grooming table",
              "ramp",
              "shelf",
              "shelving",
              "sink",
              "sprayer",
              "stool",
              "towel",
              "tub",
              "ventilation fan",
              "washer dryer",
              "waste bin",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sterile_fluorescent_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior is illuminated by harsh overhead fluorescent lights, casting a cool, sterile wash with subtle waxy, green-gray tones across the surfaces. This lighting creates an unglamorous and slightly unnerving clinical atmosphere uniformly throughout the facility.",
                "applies_to_shots": [
                  1,
                  4,
                  8
                ],
                "source_facts": [
                  "Shot 1: 'Sickly shelter fluorescents flicker... leaving the kennel corners in green-gray shadow.'",
                  "Shot 4: 'Flat fluorescent light turns the fur and skin waxy, with a faint green cast.'",
                  "Shot 8: 'Cool fluorescent wash reflects off water and steel... tender but still sterile.'"
                ],
                "visual_inferences": [
                  "Industrial fluorescent tube lighting mounted on the shelter ceiling, emitting a consistently harsh spectrum."
                ],
                "creative_decisions": [
                  "Using the consistent cool, green-tinted lighting to visually unify the different areas of the shelter (the kennel and the bathing station), reinforcing an unglamorous mood."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C11O00",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_wash_grooming_area_day_bathing",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "83d6604855d996cc"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "엇갈린 만남과 커지는 의아함",
        "representative_moment": "마트 진열대 앞에서 예상치 못한 직원의 대답을 듣고 당황해 눈이 커진 C01.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close-up, sharp facial focus with heavily blurred background, sterile greenish-white fluorescent and dusk-blue ambient lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a navy windbreaker, a young East Asian woman, facing the camera with chin slightly lifted. Head-and-shoulder composition, shoulders and upper chest visible in the lower frame. Her eyes are widened in confusion, looking just off-camera toward an implied person. Cold greenish-white fluorescent light from overhead washes across her features, while a faint dusk-blue ambient glow reflects on the side of her shoulder and neck. [L11: Out-of-focus supermarket display shelves immediately behind her, densely packed products blurring into soft vertical color bands].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot 3: 진열대 앞 50대 한국인 여성을 향해 눈을 동그랗게 뜬 수리영의 정면 얼굴.",
              "Shot 3: Cold supermarket fluorescents flatten her face",
              "Shot 3: Fluorescent-lit products blur into vertical color bands"
            ],
            "visual_inferences": [
              "C01O02's upper chest and shoulders are included in the frame to avoid a floating-head synthesis, adhering to close framing face phrasing rules",
              "The 50-year-old woman is kept off-camera to maintain the single-subject focus required by the close framing scale"
            ],
            "creative_decisions": [
              "Using heavy background blur to turn the display shelves into abstract vertical color bands, emphasizing C01's internal confusion and isolating her in the frame",
              "Mixing cold overhead fluorescent wash with a subtle dusk-blue rim light to visually anchor her in the specific twilight environment of the scene"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "81d0a1f3ac325d25",
              "owned_hash": "d2085ab95968fafc",
              "camera_direction_hash": "0ff085efb9ca4552",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "P05",
          "L11",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision inheriting the frontal close-observation stage. An eye-level CU frames 수리영’s face almost straight on, tightened so her widened eyes sit just above center while the 50대 한국인 여성 remains implied by her eyeline off-camera near the display shelf. Fluorescent-lit products blur into vertical color bands behind her, emphasizing that only her confusion has snapped into focus.",
            "lighting_mood": "Cold supermarket fluorescents flatten her face while dusk-blue spill from the entrance faintly cools the shadows, making the ordinary aisle feel uneasy.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P05",
              "L11",
              "L12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_sales_floor_dusk_normal",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "supermarket_interior_aisle",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the large retail mart features rows of display shelves heavily stocked with various products. The space is brightly illuminated by slightly greenish-white overhead fluorescent ceiling fixtures, creating a cold, uniform commercial atmosphere.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "source_facts": [
                  "Shot 3: Fluorescent-lit products blur into vertical color bands",
                  "Shot 3: Cold supermarket fluorescents flatten her face",
                  "Shot 5: Greenish-white fluorescent light mixes with faint sunset spill"
                ],
                "visual_inferences": [
                  "Standard dense product arrangement typical of a large Korean grocery store",
                  "Continuous rows of fluorescent tubes running along the ceiling"
                ],
                "creative_decisions": [
                  "Emphasizing the harsh, sterile greenish-white lighting to contrast against the natural dusk light, subtly heightening the character's growing unease"
                ],
                "confidence": "high"
              },
              {
                "element_id": "dusk_evening_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The overall environmental lighting reflects early evening twilight, characterized by a pervasive dusk-blue ambient glow. This natural dim blue light fully wraps the exterior surroundings and faintly spills through the main entrance into the building's interior, intermingling with artificial lights.",
                "applies_to_shots": [
                  3,
                  5,
                  6
                ],
                "source_facts": [
                  "Scene heading: 해질 무렵 (around dusk)",
                  "Shot 3: dusk-blue spill from the entrance faintly cools the shadows",
                  "Shot 5: faint sunset spill from the aisle opening",
                  "Shot 6: Dusk-blue ambient light wraps her profile"
                ],
                "visual_inferences": [
                  "The darkening sky outside casts a cool twilight shadow that penetrates the threshold of the automatic glass doors"
                ],
                "creative_decisions": [
                  "Using the dusk-blue tone as a consistent unifying atmospheric element across both interior observation and exterior profile shots"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C06O08",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "031ee565382a0ce7"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "의아해진 수리영",
        "representative_moment": "C01이 의아한 표정으로 고개를 갸웃하며 통로의 C06을 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium close-up, observer perspective over-the-shoulder framing, greenish-white fluorescent mixed with dusk-blue twilight spill",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition focusing on the questioning expression of C01O02 in a navy windbreaker, a young East Asian woman, occupying the left-center frame. She stands at three-quarter angle from the right, her head tilted, eyes fixed on the male employee standing across the tight aisle corner from her. In the right foreground, C06O08 in a red mart uniform, a middle-aged East Asian man, stands at three-quarter angle from the left, balancing slightly worn cardboard boxes at chest height; his figure is rendered as a soft out-of-focus presence framing the shot. [L11: The immediate frame edge features vertical metal shelves heavily stocked with blurred products, with a clear aisle opening visible behind the right side leading toward a brighter storefront.] Harsh greenish-white fluorescent light washes her cheek and shoulder, mixing with a faint dusk-blue twilight spill from the aisle opening, heightening the sickly tension.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "Shot 5: 남자 직원을 향해 고개를 살짝 기울인 수리영의 의아한 표정.",
              "S#8 action: (의아) 네? 누구랑요?",
              "Shot 5: Greenish-white fluorescent light mixes with faint sunset spill from the aisle opening"
            ],
            "visual_inferences": [
              "C06 is positioned in the foreground as an out-of-focus anchor to establish the over-the-shoulder interaction without breaking close-framing rules.",
              "The aisle corner provides a tight spatial anchor between the two characters."
            ],
            "creative_decisions": [
              "Used a head-and-shoulder composition for C01 to ensure the face does not fill the entire frame, maintaining upper body context.",
              "Mixed the harsh artificial greenish-white light on C01's face with the dusk-blue ambient background to reflect her growing internal unease."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "853798a731649787",
              "owned_hash": "d2085ab95968fafc",
              "camera_direction_hash": "da315d878b2e40bc",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "동일 씬 앞 샷(Shot 3)에서 확립된 마트 내부의 차가운 조명과 해질 무렵의 자연광이 섞인 환경 상태 및 분위기 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "C06",
          "P05",
          "L11",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision from the aisle corner as the camera completes its pan. An eye-level MCU favors 수리영 from her front-left in a subtle over-the-shoulder/over-axis arrangement, her tilted head held in the left-center foreground while 남자 직원 stands off-axis to the right with boxes at chest height. The aisle opening stays visible behind them, giving the new information a direction of escape toward the outside.",
            "lighting_mood": "Greenish-white fluorescent light mixes with faint sunset spill from the aisle opening, increasing the sickly tension as her uncertainty sharpens.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C06",
              "P05",
              "L11",
              "L12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_sales_floor_dusk_normal",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "supermarket_interior_aisle",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the large retail mart features rows of display shelves heavily stocked with various products. The space is brightly illuminated by slightly greenish-white overhead fluorescent ceiling fixtures, creating a cold, uniform commercial atmosphere.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "source_facts": [
                  "Shot 3: Fluorescent-lit products blur into vertical color bands",
                  "Shot 3: Cold supermarket fluorescents flatten her face",
                  "Shot 5: Greenish-white fluorescent light mixes with faint sunset spill"
                ],
                "visual_inferences": [
                  "Standard dense product arrangement typical of a large Korean grocery store",
                  "Continuous rows of fluorescent tubes running along the ceiling"
                ],
                "creative_decisions": [
                  "Emphasizing the harsh, sterile greenish-white lighting to contrast against the natural dusk light, subtly heightening the character's growing unease"
                ],
                "confidence": "high"
              },
              {
                "element_id": "dusk_evening_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The overall environmental lighting reflects early evening twilight, characterized by a pervasive dusk-blue ambient glow. This natural dim blue light fully wraps the exterior surroundings and faintly spills through the main entrance into the building's interior, intermingling with artificial lights.",
                "applies_to_shots": [
                  3,
                  5,
                  6
                ],
                "source_facts": [
                  "Scene heading: 해질 무렵 (around dusk)",
                  "Shot 3: dusk-blue spill from the entrance faintly cools the shadows",
                  "Shot 5: faint sunset spill from the aisle opening",
                  "Shot 6: Dusk-blue ambient light wraps her profile"
                ],
                "visual_inferences": [
                  "The darkening sky outside casts a cool twilight shadow that penetrates the threshold of the automatic glass doors"
                ],
                "creative_decisions": [
                  "Using the dusk-blue tone as a consistent unifying atmospheric element across both interior observation and exterior profile shots"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C06O08",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "138f0aaa63ba67b2"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "연결되지 않는 전화, 돌아서는 발걸음",
        "representative_moment": "C01 stands outside the supermarket in the dusk light, holding her phone to her ear and staring into the distance.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium shot, right-third framing, dusk-blue twilight with soft pink and cyan neon reflections in the background.",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a navy windbreaker, a young East Asian woman, occupies the right third of the frame in right profile, head and upper torso visible, lower body implied beyond the lower frame edge. She is holding a small smartphone pressed to her ear, screen turned away, eyes fixed on the distant dusk street. The automatic glass doors from the reference sit softly out of focus behind her in the middle background. A pervasive dusk-blue ambient light wraps her profile, while reflected neon streaks on the glass panels from the reference add faint pink and cyan accents in the soft background. Focus on her side profile against the cool evening twilight.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Scene heading: 해질 무렵 (around dusk)",
              "S#8 action: 수리영 마트 밖을 나오면서 연락을 취해보지만 받지않는다.",
              "Shot 6 description: An eye-level MS profile frames 수리영 four feet away on the sidewalk side, her side silhouette occupying the right third as she presses a phone to her ear"
            ],
            "visual_inferences": [
              "fixed_element dusk_evening_lighting: pervasive dusk-blue ambient glow wraps her profile",
              "Reflected neon streaks from the glass doors create an urban dusk texture",
              "Phone is held tight to the ear indicating an anxious attempt to connect"
            ],
            "creative_decisions": [
              "Placed C01 on the right third to emphasize the empty space ahead, mirroring her feeling of disconnect",
              "Used cool dusk-blue fill with pink and cyan rim accents to heighten the feeling of uneasy isolation",
              "Kept the background automatic doors out of focus to maintain visual priority on her expression"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "93821eb523bb2b56",
              "owned_hash": "f09a73301b99308c",
              "camera_direction_hash": "41d24a6df5c411b9",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "The automatic glass doors from the reference",
                  "reason": "The prompt refers to the existing doors from the reference as a background anchor, not as newly created or modified objects.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "glass panel",
                  "violating_phrase": "reflected neon streaks on the glass panels from the reference",
                  "reason": "The glass panels are mentioned as part of the referenced background and only receive reflective color description, which is an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "exact_background reference from S8_Shot3 to maintain spatial continuity of the supermarket exterior entrance.",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "P05",
          "L11",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision after the cut outside. An eye-level MS profile frames 수리영 four feet away on the sidewalk side, her side silhouette occupying the right third as she presses a phone to her ear; the automatic supermarket doors sit softly behind her in the middle background. The phone remains small and realistic near her cheek, while reflected neon and dusk traffic flicker across the glass without taking over the frame.",
            "lighting_mood": "Dusk-blue ambient light wraps her profile while supermarket fluorescents and neon reflections add uneasy pink and cyan accents behind her.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P05",
              "L11",
              "L12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "cb_exterior_entrance_dusk_phone",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "alcove",
              "ceiling light",
              "curb",
              "door",
              "door sensor",
              "floor mat",
              "glass panel",
              "sidewalk",
              "storefront",
              "street",
              "wall"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_evening_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The overall environmental lighting reflects early evening twilight, characterized by a pervasive dusk-blue ambient glow. This natural dim blue light fully wraps the exterior surroundings and faintly spills through the main entrance into the building's interior, intermingling with artificial lights.",
                "applies_to_shots": [
                  3,
                  5,
                  6
                ],
                "source_facts": [
                  "Scene heading: 해질 무렵 (around dusk)",
                  "Shot 3: dusk-blue spill from the entrance faintly cools the shadows",
                  "Shot 5: faint sunset spill from the aisle opening",
                  "Shot 6: Dusk-blue ambient light wraps her profile"
                ],
                "visual_inferences": [
                  "The darkening sky outside casts a cool twilight shadow that penetrates the threshold of the automatic glass doors"
                ],
                "creative_decisions": [
                  "Using the dusk-blue tone as a consistent unifying atmospheric element across both interior observation and exterior profile shots"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C06O08",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "cb_exterior_entrance_dusk_phone",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "ba33c1881f482fc1"
      },
      {
        "scene_index": 9,
        "heading": "S#9. 해안가 / N",
        "beat_title": "달빛 아래의 급박한 귀가",
        "representative_moment": "차가운 달빛을 등지고 가파른 해안도로를 자전거로 힘차게 오르는 C01의 역동적인 실루엣.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle tracking perspective from behind and beside, deep blue-black underexposed moon backlight",
            "t2i_prompt": "Photorealistic cinematic still. Low angle observer perspective from behind and slightly beside. C01O02 in a dark windbreaker, a young East Asian woman, in left profile, mid-pedal on a bicycle climbing a steep coastal road. Her torso is pitched forward, one knee bent sharply in the down stroke, gripping the handlebar, the bicycle frame and wheels visible in the lower half of the frame. She is rendered as a backlit figure, a thin rim of cold moonlight tracing her shoulder, curved back, and jawline, her body volume preserved against the deep blue-black ambient fill. Her eyes look up the diagonal uphill asphalt. Dense blue-gray coastal haze blooms in the seaward background. The bright, cold moon behind her, partially veiled by fog, casts a harsh glare, catching subtle highlights on the slightly damp road surface. Focus on her forward-leaning posture against the steep incline.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#9 action: '해안도로를 자전거를 타고 바삐 집으로 달려가는 수리영.'",
              "shot description: low angle tracking 3-5m behind and beside, pedaling hard uphill, backlit silhouette, pitched forward",
              "shot description: bright cold moon, dense blue-gray coastal haze"
            ],
            "visual_inferences": [
              "bicycle frame and wheels placed in the lower frame to match the low angle perspective",
              "rim lighting and volume cues added to prevent flat cutout silhouette effect",
              "mid-pedal pose with bent knee captures the kinetic motion accurately in a still frame"
            ],
            "creative_decisions": [
              "deep blue-black underexposed lighting to emphasize urgent tension",
              "diagonal composition of the road rising to the left to enhance the feeling of climbing a steep incline"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "941648d5f3c69f6e",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "99e9552e6d3c462b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 6,
        "dependency_reason": "동일한 해안도로 공간의 지형적 분위기 및 색감(atmosphere reference) 유지",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 9,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision from the seaward shoulder. A low angle WS tracks three to five meters behind and beside 수리영, exposing for the cold moon so she and the bicycle become a hard black silhouette climbing the steep road across the center-left of frame. Her torso is pitched forward at the strongest pedal stroke, one knee bent sharply, with the uphill asphalt cutting diagonally toward the moonlit haze.",
            "lighting_mood": "Underexposed moon backlight carves everything into blue-black silhouette, with coastal haze blooming around the edges like an omen.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 6,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "287fe4aed51c0d5f"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "전단지를 이용한 무단 침입",
        "representative_moment": "거친 남자의 손이 굳게 닫힌 철문 틈새로 전단지를 밀어 넣는 클로즈업 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level extreme close-up (ECU) focusing tightly on the door seam, hand, and flyer, compressing them into the center while the rest falls into blackened negative space.",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up on the narrow vertical seam of an iron door. The rough hand of a middle-aged East Asian man in a dark trench coat tightly grips a creased paper flyer, forcing its edge leftward into the door's latch line. The paper flyer is angled like a thin blade entering the narrow gap. The scratched metal surface of [L04: the dark iron door, stained with sharp crimson-brown rust accents] frames the hand and paper, catching a weak rooftop practical light and cool moon spill. The immediate metal surface is clearly visible around the seam, while the outer edges of the frame drop rapidly into dirty blue-black shadow and heavy negative space.",
            "outfit_assignments": [],
            "source_facts": [
              "S#10 action: '전단지를 뽑아서 손가락으로 문틈에 꾹 밀어 넣는다.'",
              "shot description: Close-up of a rough man's hand firmly gripping a paper flyer inserted into the iron door's narrow seam."
            ],
            "visual_inferences": [
              "The flyer acts as a thin blade forcing the latch.",
              "Scratched iron door surface frames the action.",
              "Weak rooftop practical and cool moon spill hitting the hand and the paper."
            ],
            "creative_decisions": [
              "Applied the body_part_focus_rule by replacing the C10O12 ID with a common noun and demographic descriptor (hand of a middle-aged East Asian man) to prevent face-reference injection issues.",
              "Used heavy negative space and dirty blue-black shadow at the frame edges to emphasize the claustrophobic and tense intrusion.",
              "Omitted any background references as this is an extreme close-up focusing purely on the surface and the hand."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "17a65b93c9a80a0e",
              "owned_hash": "17c170cf5d0badbe",
              "camera_direction_hash": "216bdec6405cd591",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "동일한 옥탑방 외부 철문 구조 (단, 본 샷은 ECU 클로즈업 컷으로 배경 참조를 직접 사용하지 않고 표면 질감만 유지)",
        "_shot_index": 3,
        "visible_entities": [
          "C10",
          "P04",
          "P07",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision at the iron door’s seam. An eye-level ECU dollies inches toward the narrow gap, with 거친 남자’s hand, the paper flyer, and the dark door seam compressed into the center while the rest of the iron door drops into blackened negative space. The flyer is angled like a thin blade entering the latch line, but it stays proportionate and framed by the scratched metal surface for scale.",
            "lighting_mood": "A weak rooftop practical and moon spill skim the hand and paper, leaving the iron door in dirty blue-black shadow with a sharp crimson-brown rust accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C10",
              "P04",
              "P07",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C05",
                "outlook_id": "O06"
              },
              {
                "character_id": "C10",
                "outlook_id": "O12"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_rooftop_night_intrusion_door_shadow",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C10O12",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "1369eef017322468"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "어둠 속의 급습",
        "representative_moment": "어두운 옥탑방 안, 침입자가 민숙의 어깨를 강하게 물어뜯기 직전의 클로즈업 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Handheld tight composition with a slight Dutch angle, dominated by cold blue-black shadows and a narrow, sickly window spill.",
            "t2i_prompt": "Photorealistic cinematic still. A slanted, tight frame focused on the terrifying contact point between two figures. The neck and taut, rumpled fabric of an East Asian woman's shoulder form the foreground plane, her head twisting away in left profile, eyes staring into the void. Emerging from the heavy shadow on the left edge, the lower face of an East Asian man at a three-quarter angle leans in aggressively, his jaw open and teeth forcefully meeting the skin of her shoulder in the center-right of the frame. Engulfed in cold blue-black shadows, a narrow strip of sickly cold window spill falls specifically on the man's teeth and the woman's neck. Behind them, [L04: nearly black, rough wallpaper texture of a cramped enclosure] is softly blurred in the shallow depth of field, enveloped in a dark, violent stillness.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 7 description: 'A handheld CU with a slight Dutch angle pauses almost still at shoulder height beside 한국인 여자, angled across her shoulder toward 한국인 남자’s mouth as it meets the skin in the center-right of frame.'",
              "Lighting: 'Near-dark interior lighting uses a narrow strip of cold window spill to catch skin and teeth, with the rest swallowed by blue-gray shadow'",
              "Action: '창문에 비친 그림자. 민숙을 덮쳐 어깨를 물어뜯는 듯한 모습'"
            ],
            "visual_inferences": [
              "fixed_element dark_rooftop_room_interior applied to lighting mood without mentioning the existing room layout (skipped_close_framing)",
              "The scene's violent nature translates into the tight, claustrophobic framing and the aggressive posture of the lower face entering the frame.",
              "Body-part focus rule triggered; composite IDs removed and replaced with common nouns + demographic descriptors."
            ],
            "creative_decisions": [
              "Used a slanted Dutch angle description ('slanted, tight frame') without naming 'CU' or 'Dutch angle' directly in the prompt to ensure T2I spatial consistency.",
              "Confined the lighting effects to 'falling on' the surfaces rather than 'cutting' the skin to prevent the model from rendering physical lacerations."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "cb8f9d29afe04b25",
              "owned_hash": "17c170cf5d0badbe",
              "camera_direction_hash": "67ea0d30f1be35f7",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "S4_Shot1 used as background location reference, but intentionally skipped in this shot due to extreme close framing (mode: skipped_close_framing).",
        "_shot_index": 7,
        "visible_entities": [
          "P04",
          "P07",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Observer perspective, direct vision inside the cramped room. A handheld CU with a slight Dutch angle pauses almost still at shoulder height beside 한국인 여자, angled across her shoulder toward 한국인 남자’s mouth as it meets the skin in the center-right of frame. The woman’s shoulder and neck form the foreground plane, while the man’s lower face enters from the dark left edge, making the contact point the only sharp, terrifying detail before the scream.",
            "lighting_mood": "Near-dark interior lighting uses a narrow strip of cold window spill to catch skin and teeth, with the rest swallowed by blue-gray shadow and a sickly, violent stillness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P04",
              "P07",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C05",
                "outlook_id": "O06"
              },
              {
                "character_id": "C10",
                "outlook_id": "O12"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_rooftop_night_intrusion_door_shadow",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dark_rooftop_room_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the room is engulfed in heavy, cold blue-black shadows. A weak, sickly strip of light spills from an unseen window, cutting through the intense darkness and faintly illuminating the soft, dingy texture of a dirty wall in the background.",
                "applies_to_shots": [
                  7,
                  8
                ],
                "source_facts": [
                  "Shot 7 lighting: 'Near-dark interior lighting uses a narrow strip of cold window spill to catch skin and teeth, with the rest swallowed by blue-gray shadow'",
                  "Shot 8 lighting: 'Cold blue-black room darkness is cut by a weak sickly spill from outside'",
                  "Shot 8 camera: 'soft, dirty wall blur'"
                ],
                "visual_inferences": [
                  "The weak light source mimics nighttime streetlamps or faint moonlight, emphasizing the neglected and isolated nature of the rooftop room."
                ],
                "creative_decisions": [
                  "Maintaining a consistent cold blue-black color palette across the interior shots to establish a claustrophobic, violent, and terrifying atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C10O12",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "0da72a75f8d8c2be"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "어둠 속의 비명",
        "representative_moment": "screams in agony with eyes tightly closed, her terrified expression illuminated by faint, cold light.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight close-up framing at face height with a slight upward angle, shallow depth of field on the background",
            "t2i_prompt": "Photorealistic cinematic still. in a dark shirt, a middle-aged East Asian woman, facing the camera with her head thrown back, eyes tightly closed, mouth stretched wide in a terrified scream. Tight framing on her expression, her neck and a slice of her shoulder visible at the lower edge, viewed from face height with a slight upward angle. Focus on her agonizing expression and sweat-dark skin texture, the attacker completely excluded from the frame. Heavy cold blue-black shadows pool around her, cut by a weak sickly strip of light falling across [: a soft, dirty wall blur behind her], while a raw crimson warmth reflects on her cheek and open mouth.",
            "outfit_assignments": [],
            "source_facts": [
              "S#10 action: '민숙을 덮쳐 어깨를 물어뜯는 듯한 모습 아악-'",
              "Shot 8: 눈을 질끈 감고 입을 크게 벌린 한국인 여성의 고통스러운 얼굴 클로즈업.",
              "DP instructions: ECU, eye-level with slight upward pressure, holding clenched eyelids, stretched mouth, attacker completely excluded."
            ],
            "visual_inferences": [
              "fixed_element 'dark_rooftop_room_interior' dictates the heavy cold blue-black shadows and weak sickly light strip.",
              "The violent attack is visually implied by her raw expression and the crimson reflection, without depicting the assailant."
            ],
            "creative_decisions": [
              "Added neck and shoulder slice to the ECU to comply with face-framing safety rules and prevent a floating head artifact.",
              "Replaced 'focus on eyelids' with 'focus on expression' to avoid triggering the body-part focus fallback (which forbids C##O## IDs).",
              "Directed the lighting to 'fall across' the wall and 'reflect on' her cheek to avoid physically cutting the character with light."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "add088849e139567",
              "owned_hash": "17c170cf5d0badbe",
              "camera_direction_hash": "8f1fd5477665fd93",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 10,
        "dependency_reason": "Shot 7 established the heavy cold blue-black interior shadows and weak light source of the dark rooftop room.",
        "_shot_index": 8,
        "visible_entities": [
          "P04",
          "P07",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From inside the dark rooftop room at face height and slightly below the woman's eyeline, the pan dies into an extreme close-up (ECU), eye-level with a slight upward pressure, holding only her clenched eyelids, stretched mouth, and sweat-dark skin texture. This is direct observer vision, not the attacker's POV; the attacker is completely excluded, and her face occupies most of the frame against a soft, dirty wall blur.",
            "lighting_mood": "Cold blue-black room darkness is cut by a weak sickly spill from outside, with a raw crimson warmth implied in the skin and mouth.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P04",
              "P07",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C05",
                "outlook_id": "O06"
              },
              {
                "character_id": "C10",
                "outlook_id": "O12"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_rooftop_night_intrusion_door_shadow",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dark_rooftop_room_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the room is engulfed in heavy, cold blue-black shadows. A weak, sickly strip of light spills from an unseen window, cutting through the intense darkness and faintly illuminating the soft, dingy texture of a dirty wall in the background.",
                "applies_to_shots": [
                  7,
                  8
                ],
                "source_facts": [
                  "Shot 7 lighting: 'Near-dark interior lighting uses a narrow strip of cold window spill to catch skin and teeth, with the rest swallowed by blue-gray shadow'",
                  "Shot 8 lighting: 'Cold blue-black room darkness is cut by a weak sickly spill from outside'",
                  "Shot 8 camera: 'soft, dirty wall blur'"
                ],
                "visual_inferences": [
                  "The weak light source mimics nighttime streetlamps or faint moonlight, emphasizing the neglected and isolated nature of the rooftop room."
                ],
                "creative_decisions": [
                  "Maintaining a consistent cold blue-black color palette across the interior shots to establish a claustrophobic, violent, and terrifying atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 10,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C10O12",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "a0583fa8d3fec88d"
      },
      {
        "scene_index": 11,
        "heading": "S#11. 옥탑 방 밖 / N",
        "beat_title": "반쯤 열린 현관 철문을 발견한 순간",
        "representative_moment": "C01이 옥상에 도착해 코를 찌르는 악취와 반쯤 열린 철문을 굳은 표정으로 주시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium close-up at a slight low angle, cool gray-blue ambient with sickly fluorescent spill",
            "t2i_prompt": "Photorealistic cinematic still. Medium close-up at a slight low angle, waist-up visible, focus on her tense expression. C01O02 in a navy windbreaker, a young East Asian woman, positioned at a three-quarter angle from the left. Her shoulders are rigid in the lower half of the frame, her eyes fixed intently past the lens toward an unseen half-open iron door. The environment is immersed in cold, muted gray-blue coastal night darkness. A faint, sickly fluorescent light spills from the off-camera doorway, washing the side of her face with a pale highlight against the gloomy ambient shadows. [L04: A dark, partially fogged rooftop railing extends directly behind her, fading into the hazy night boundary, with the subtle silhouette of a water tank obscured in the dense fog].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#11 action: 옥상에 올라와 보니 반쯤 열린 현관 철문.",
              "Shot description: 옥상 바닥에 두 발을 딛고 선 채 앞을 뚫어지게 주시하는 수리영의 상체",
              "Shot 4 lighting: Muted coastal night blues flatten the rooftop while a faint fluorescent spill from the doorway gives her skin a sickly pallor."
            ],
            "visual_inferences": [
              "fixed_element eerie_doorway_lighting: The off-camera fluorescent light serves as the primary practical highlight source, consistently illuminating subjects facing the unseen half-open door.",
              "A low angle MCU emphasizes the character's rigid posture and psychological tension without showing her lower body."
            ],
            "creative_decisions": [
              "Implemented the 'skipped_close_framing' policy by focusing tightly on the subject and describing only the immediate frame-edge background elements (the fogged railing) using the [L04] block.",
              "Used 'washing the side of her face' to convey the sickly fluorescent light spill without triggering physically cutting verbs.",
              "Maintained single viewpoint by keeping the off-camera door merely implied through her gaze and lighting, preventing view mixing."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "74da5ce750ea5ed2",
              "owned_hash": "98a58c7b3b700047",
              "camera_direction_hash": "48afc9eef4d16e7c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No directly preceding visual dependency outside the internal continuity elements provided for this shot.",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "L04",
          "L05",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "On the rooftop floor about two meters in front of 수리영, the camera holds a medium close-up (MCU) at a slight low angle, derived from the chest-height frontal axis of the flow. 수리영 is centered but turned just off-axis, her shoulders rigid in the lower half while her gaze cuts past the lens line toward the half-open iron door behind camera.",
            "lighting_mood": "Muted coastal night blues flatten the rooftop while a faint fluorescent spill from the doorway gives her skin a sickly pallor.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L04",
              "L05",
              "L06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_approach_night_open_door",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "eerie_doorway_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surrounding environment is immersed in a cold, muted gray-blue coastal night darkness. A faint, sickly fluorescent light spills from an unseen, half-open doorway located just outside the frame, casting a distinct, harsh highlight against the gloomy ambient shadows.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "Shot 4 lighting: Muted coastal night blues flatten the rooftop while a faint fluorescent spill from the doorway gives her skin a sickly pallor.",
                  "Shot 6 lighting: A cold gray-blue top wash and a thin, dirty doorway highlight catch in her pupils."
                ],
                "visual_inferences": [
                  "The off-camera fluorescent light serves as the primary practical highlight source, consistently illuminating subjects facing the unseen half-open door."
                ],
                "creative_decisions": [
                  "Maintaining a stark contrast between the cool night ambient wash and the unnerving, pale doorway spill to unify the visual tone across different focal lengths."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "3ac7b697e2edd115"
      },
      {
        "scene_index": 11,
        "heading": "S#11. 옥탑 방 밖 / N",
        "beat_title": "불길한 예감과 발견",
        "representative_moment": "반쯤 열린 현관 철문을 향해 시선이 고정된 C01의 확장된 두 눈 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up (ECU), eye-level, cold gray-blue wash with sickly fluorescent highlight",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up at eye level, focusing tightly on the widened eyes of a young East Asian woman facing the camera. Both eyes dominate the composition, while the bridge of her nose and her furrowed brow form tight borders at the frame's edges. Her pupils are heavily dilated, fixed beyond the camera. A cold, muted gray-blue coastal night ambient wash bathes her pale skin. A faint, sickly pale fluorescent light from an unseen doorway spills across her features, catching as a sharp, dirty highlight in her wet, terrified eyes, leaving a barely perceptible reflection of a half-open iron door in her pupils. The immediate background is completely out of focus, immersed in a shallow, murky night fog.",
            "outfit_assignments": [],
            "source_facts": [
              "S#11 action: '옥상에 올라와 보니 반쯤 열린 현관 철문.'",
              "shot description: extreme close-up (ECU), eye-level, with both of 수리영's widened eyes dominating the frame"
            ],
            "visual_inferences": [
              "fixed_element eerie_doorway_lighting: cold gray-blue coastal night darkness with a faint, sickly fluorescent light spilling from an unseen half-open doorway",
              "the reflection of the iron door is visible only as a glint in her pupils due to the tight ECU framing"
            ],
            "creative_decisions": [
              "Used tight ECU framing to emphasize pure terror without C##O## ID, adhering to body-part focus rules, restricting the background to a soft blur to keep the visual anchor entirely on her highlighted pupils"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d388b79e5719fd06",
              "owned_hash": "98a58c7b3b700047",
              "camera_direction_hash": "8c20f6748800d152",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "같은 씬의 앞선 샷(Shot 4)에서 확립된 옥탑방 외부의 서늘한 푸른 밤 조명과 열린 문에서 새어나오는 형광등 불빛의 질감을 연속적으로 유지",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "L04",
          "L05",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Continuing along the same frontal axis, the dolly-in ends in an extreme close-up (ECU), eye-level, with both of 수리영's widened eyes dominating the frame while the bridge of her nose and brow form tight borders. The shot remains direct observer vision; her pupils are fixed beyond the camera toward the open iron door, and the rooftop background disappears into shallow darkness.",
            "lighting_mood": "A cold gray-blue top wash and a thin, dirty doorway highlight catch in her pupils, making the eyes feel wet and terrified.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L04",
              "L05",
              "L06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_approach_night_open_door",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "eerie_doorway_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surrounding environment is immersed in a cold, muted gray-blue coastal night darkness. A faint, sickly fluorescent light spills from an unseen, half-open doorway located just outside the frame, casting a distinct, harsh highlight against the gloomy ambient shadows.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "Shot 4 lighting: Muted coastal night blues flatten the rooftop while a faint fluorescent spill from the doorway gives her skin a sickly pallor.",
                  "Shot 6 lighting: A cold gray-blue top wash and a thin, dirty doorway highlight catch in her pupils."
                ],
                "visual_inferences": [
                  "The off-camera fluorescent light serves as the primary practical highlight source, consistently illuminating subjects facing the unseen half-open door."
                ],
                "creative_decisions": [
                  "Maintaining a stark contrast between the cool night ambient wash and the unnerving, pale doorway spill to unify the visual tone across different focal lengths."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "6daeb39cb0240a6f"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "엄마의 죽음을 발견하는 수리영",
        "representative_moment": "Narrow door gap revealing vivid red bloodstains smeared across the muted floor.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "knee height, Dutch angle, narrow through-doorway framing",
            "t2i_prompt": "Photorealistic cinematic still. [L07: A narrow vertical gap between a dark, dirty wooden door edge and its jamb dominates the foreground, slicing the view into dark vertical bands.] Focus on the violently smeared, fresh vivid red bloodstains and heavy streaks occupying the center-right of the muted floor just beyond the threshold. The wet, glistening blood trails deeper into the dim interior. Sickly ambient spill light and cold blue shadows wash across the pale floor surface, making the raw crimson marks look unnaturally vivid. Viewed from knee height with the floor tilted slightly in a Dutch angle, compressing the space and drawing attention to the disturbing trail.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: '여기저기 핏자국. 바닥에 흥건한 혈흔. 피묻은 발자국은 커튼으로 이어져 있다.'",
              "Shot description: At knee height outside 수리영's bedroom doorway, the camera compresses into a close-up (CU), Dutch angle, using the narrow door gap as through-object framing. The red blood marks sit in the center-right of the floor."
            ],
            "visual_inferences": [
              "fixed_element bloody_bedroom_floor: fresh, vivid red bloodstains and smeared pools maintaining a wet, glistening appearance under the dim interior light",
              "No characters are visible in this specific frame; the focus is entirely on the environmental state of the floor viewed through the narrow gap."
            ],
            "creative_decisions": [
              "Used a narrow door gap in the foreground to create a claustrophobic, restrictive framing that hides the rest of the room.",
              "Applied sickly spill light and cold blue shadows to contrast sharply with the vivid crimson blood, heightening the horror atmosphere."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "dec855d944079c32",
              "owned_hash": "50e0a1bb6b2bd65b",
              "camera_direction_hash": "7f93a242364de21c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "Same rooftop location, continuity of the spatial layout although the framing here is a close focus on the floor.",
        "_shot_index": 7,
        "visible_entities": [
          "P05",
          "P08",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At knee height outside 수리영's bedroom doorway, the camera compresses into a close-up (CU), Dutch angle, using the narrow door gap as through-object framing. The red blood marks sit in the center-right of the floor beyond the threshold, while the dirty door edge and jamb slice the foreground into dark vertical bands; the implied dolly direction is carried by the trail leading deeper inside.",
            "lighting_mood": "Sickly interior spill and cold blue shadow make the fresh red blood look unnaturally vivid against the muted floor.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P05",
              "P08",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_daughter_bedroom_night_blood_curtain_body_red_circle",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "bloody_bedroom_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surface of the room's floor is violently covered in fresh, vivid red bloodstains and smeared pools of blood. Darker, heavier streaks of blood form a disturbing trail across the muted flooring, maintaining a wet, glistening appearance under the dim interior light.",
                "applies_to_shots": [
                  7,
                  10
                ],
                "source_facts": [
                  "Scene text: '여기저기 핏자국. 바닥에 흥건한 혈흔. 피묻은 발자국은 커튼으로 이어져 있다.'",
                  "Shot 7: 'The red blood marks sit in the center-right of the floor beyond the threshold'",
                  "Shot 10: 'smeared floor remain blurred at the frame edges', 'crimson floor reflections flickering'"
                ],
                "visual_inferences": [
                  "The floor is made of a standard, muted material (like linoleum or wood) typical of a Korean rooftop room, providing a stark contrast to the red blood.",
                  "The blood is fresh and wet, creating glossy reflections that catch the ambient room light."
                ],
                "creative_decisions": [
                  "Using the vibrant crimson color and smeared texture of the blood to anchor the spatial continuity and horror atmosphere across different camera angles in the room."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 14,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "55fc74ea9140edde"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "자신의 방에서 끔찍한 시신을 발견하고 경악함",
        "representative_moment": "C01이 커튼 뒤를 확인한 후, 두 눈을 크게 뜨고 경악하며 뒤로 주춤하는 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Handheld close-up, Dutch angle, cold window haze with crimson floor reflections",
            "t2i_prompt": "Photorealistic cinematic still. Handheld close-up, Dutch angle. C01O02 in a navy windbreaker, a young East Asian woman, facing the camera, recoiling mid-breath. Tight framing on her face, upper chest and shoulders in frame. Her eyes are blown wide and mouth slightly open in deep shock, eyes fixed on a blurred shape directly ahead. Focus on her wide eyes. Cold window haze and weak yellow-green ambient light wash over her features, while vivid crimson reflections from the floor below pool on her jawline and jacket collar. [L07: Out-of-focus parted curtain at the side and blurred wet crimson streaks on the floor surface visible at the lower frame edge].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Scene text: '수리영 방 ... 호흡을 가다듬고 커튼을 젖히자 앉은 채로 고개를 떨군 채 죽어있는 엄마'",
              "Shot description: 수리영's face fills the center, eyes blown wide and mouth open, recoiling mid-breath"
            ],
            "visual_inferences": [
              "fixed_element bloody_bedroom_floor: vivid red bloodstains reflecting light from below onto her face",
              "Dutch angle and handheld feel emphasize shock and sudden panic"
            ],
            "creative_decisions": [
              "Used 'tight framing on her face, upper chest and shoulders in frame' to satisfy the close_framing_face_phrasing rule and avoid floating head artifacts.",
              "Applied 'skipped_close_framing' background rule by omitting room architecture and only describing frame-edge elements (curtain and blood reflection) within [L07]."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "6ce09ea9dad2654b",
              "owned_hash": "9f4861cca11ac4b0",
              "camera_direction_hash": "ccc1472e5f0edd23",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Shot 7 established the bloody floor elements, which are now carried into the frame-edge reflections for this close-up.",
        "_shot_index": 10,
        "visible_entities": [
          "C01",
          "P05",
          "P08",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside 수리영's bedroom near the curtained window, the handheld camera pushes into a close-up (CU), Dutch angle, frontal enough to trap her shock but trembling with her breath. 수리영's face fills the center, eyes blown wide and mouth open, while the parted curtain and smeared floor remain blurred at the frame edges as evidence of what she has just uncovered.",
            "lighting_mood": "The handheld close-up is lit by cold window haze and weak yellow-green room spill, with crimson floor reflections flickering at the bottom edge.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P05",
              "P08",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_night_aftermath_tv_cups",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "bloody_bedroom_floor",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surface of the room's floor is violently covered in fresh, vivid red bloodstains and smeared pools of blood. Darker, heavier streaks of blood form a disturbing trail across the muted flooring, maintaining a wet, glistening appearance under the dim interior light.",
                "applies_to_shots": [
                  7,
                  10
                ],
                "source_facts": [
                  "Scene text: '여기저기 핏자국. 바닥에 흥건한 혈흔. 피묻은 발자국은 커튼으로 이어져 있다.'",
                  "Shot 7: 'The red blood marks sit in the center-right of the floor beyond the threshold'",
                  "Shot 10: 'smeared floor remain blurred at the frame edges', 'crimson floor reflections flickering'"
                ],
                "visual_inferences": [
                  "The floor is made of a standard, muted material (like linoleum or wood) typical of a Korean rooftop room, providing a stark contrast to the red blood.",
                  "The blood is fresh and wet, creating glossy reflections that catch the ambient room light."
                ],
                "creative_decisions": [
                  "Using the vibrant crimson color and smeared texture of the blood to anchor the spatial continuity and horror atmosphere across different camera angles in the room."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "63d718ac2eace0ff"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "붉은 원의 출현과 초자연적 공포",
        "representative_moment": "침대 위 흰색 벽지 한가운데 붉은 원형 표식이 기이하게 드러난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium framing perfectly centered on the wall, flat cold interior light",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level medium framing perfectly centered on the blank wall from the reference. Focus on the large red circle from the reference in the middle of the frame, appearing saturated, vivid, and wet-looking against the bone-white surface. Flat cold interior light illuminates the room. The bed from the reference forms a low horizontal base in the lower frame, anchoring the motionless, symmetrical room geometry. Completely devoid of any characters.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot description: 침대 위 텅 빈 흰색 벽지 한가운데 붉은 물감으로 그려진 듯한 커다란 원형 표식의 정지 구도",
              "DP notes: Opposite the bed at eye height, the camera locks into a wide shot (WS), eye-level, perfectly centered on the blank white wall above the bed... no characters visible."
            ],
            "visual_inferences": [
              "No characters are visible, allowing pure focus on the supernatural phenomenon on the wall",
              "The room's stillness contrasts with the vividness of the occult symbol"
            ],
            "creative_decisions": [
              "Applied 'from the reference' phrasing for 'wall', 'circle', and 'bed' to satisfy exact_background and owned_objects rules, preventing duplicate generation",
              "Used flat cold interior light to drain the surroundings and emphasize the saturated red of the symbol"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "2bb0022f5a7865a6",
              "owned_hash": "50e0a1bb6b2bd65b",
              "camera_direction_hash": "0c2ec342c0f79d05",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "circle",
                  "violating_phrase": "the large red circle from the reference",
                  "reason": "The phrase explicitly marks the circle as coming from the reference, so it is an anchor reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bed",
                  "violating_phrase": "The bed from the reference",
                  "reason": "The bed is referenced as existing in the source scene, which makes this an anchor reference, not a request to create or modify it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "the blank wall from the reference",
                  "reason": "The wall is explicitly described as from the reference, so it is anchored rather than newly generated.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Same room and environment as S12_Shot7; preserves the established exact_background without adding new characters or conflicting background elements.",
        "_shot_index": 20,
        "visible_entities": [
          "P05",
          "P08",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 20
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Opposite the bed at eye height, the camera locks into a wide shot (WS), eye-level, perfectly centered on the blank white wall above the bed. The red circular symbol sits in the middle of the frame like wet paint, large but not overwhelming, with the bed forming a low horizontal base and no characters visible.",
            "lighting_mood": "Flat cold interior light drains the wall to bone-white while the red circle appears saturated and occult, as if projected into reality.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P05",
              "P08",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C05",
                "outlook_id": "O06"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_daughter_bedroom_night_blood_curtain_body_red_circle",
            "reference_usage": "exact_background",
            "owned_objects": [
              "backpack",
              "bed",
              "circle",
              "curtain",
              "doll",
              "door",
              "floor",
              "photo",
              "pillow",
              "sheet",
              "wall",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C05O06",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_daughter_bedroom_night_blood_curtain_body_red_circle",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "72e275431cdd6e56"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "공포에 질린 수리영과 그녀를 붙잡은 혜수",
        "representative_moment": "수리영(C01)의 어깨를 붙잡고 얼굴을 들여다보는 혜수(C02)",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level composition, cold foggy night with striking red-blue strobe reflections.",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the two figures locked in a tense grip in the middle ground, both visible from the thighs up. C01O02 in a navy windbreaker, a young East Asian woman, occupies the foreground nearer to the camera, with back to the camera, head tilted slightly so her side profile is visible, eyes staring into the void, her body slumped forward. C02O03 in a gray leather jacket, a middle-aged East Asian woman, stands squared behind her on the shared concrete yard from the reference, at three-quarter angle from the right, two hands firmly gripping C01O02's shoulders, eyes fixed on C01O02. The dark exterior environment is enveloped in cold night fog. Harsh blue and red police strobe lights wash over their jackets and cut through the mist, illuminating the yard and the building from the reference with a striking, urgent glare. The emergency vehicle, stair, and railing from the reference recede into the hazy background.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "Scene text: 멍하니 서있는 수리영의 모습을 발견하고 달려간다.",
              "Shot extract: 수리영의 어깨를 양손으로 감싸 쥔 혜수의 정지 구도.",
              "DP instructions: 수리영 slightly nearer to camera, 혜수 squared behind her gripping shoulders."
            ],
            "visual_inferences": [
              "fixed_element police_strobe_lighting: cold night fog swept by pulsing red and blue police strobe lights.",
              "수리영's face is slightly visible in profile to maintain identifiability while keeping her back mostly to the camera."
            ],
            "creative_decisions": [
              "Eye-level composition capturing from the thighs up, avoiding explicit shot type keywords.",
              "Anchored background elements (concrete yard, building, emergency vehicle, stair, railing) explicitly to the reference image to prevent duplication."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d4e5f0da6a4fb5e0",
              "owned_hash": "da184dd47ed9e9fa",
              "camera_direction_hash": "7d71cb484b0cd941",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "yard",
                  "violating_phrase": "the shared concrete yard from the reference",
                  "reason": "The phrase references the existing yard in the background as an anchor, not a newly created or modified object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "building",
                  "violating_phrase": "the building from the reference",
                  "reason": "The building is mentioned as an existing reference element and is not directly targeted by any redraw verb.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "emergency vehicle",
                  "violating_phrase": "The emergency vehicle ... from the reference",
                  "reason": "The emergency vehicle is referenced as an existing background object from the reference, which is anchoring rather than redrawing.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stair",
                  "violating_phrase": "stair ... from the reference",
                  "reason": "The stair is mentioned as part of the existing reference environment and is not explicitly being created or altered.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "railing",
                  "violating_phrase": "railing from the reference",
                  "reason": "The railing is only cited as an existing reference object, so this is an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "S11_Shot6의 배경(bg_approach_night_siren_arrival)을 exact_background로 사용하여 동일한 공간적 연속성 유지",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "C02",
          "L05",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "On the exterior path between the stairway and police car, the camera holds a medium wide shot (MWS), eye-level, in a locked two-shot after the preceding movement. 혜수's two hands gripping 수리영's shoulders become the center anchor, with 수리영 slightly nearer to camera and 혜수 squared behind her in the middle ground, the siren-lit rooftop receding around them.",
            "lighting_mood": "Blue-red police strobes rake across cold rooftop fog, freezing the women in alternating panic and procedural glare.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C02",
              "L05",
              "L06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_approach_night_siren_arrival",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "boundary wall",
              "building",
              "door",
              "drain channel",
              "emergency vehicle",
              "gate",
              "landing",
              "plume",
              "railing",
              "road",
              "security light",
              "stain",
              "stair",
              "utility pole",
              "window",
              "yard"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_strobe_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The dark exterior environment is enveloped in cold night fog and continuously swept by pulsing red and blue police strobe lights. These harsh, alternating colored glares cut through the mist, illuminating the surroundings with a striking and urgent atmosphere.",
                "applies_to_shots": [
                  4,
                  5,
                  6
                ],
                "source_facts": [
                  "Scene text mentions sirens sounding and a police car arriving ('동시에 사이렌이 울리고~. 차에서 내린 혜수').",
                  "Shot 4 describes 'Blue-red police strobes rake across cold rooftop fog'.",
                  "Shot 5 describes 'pulsing red-blue siren light'.",
                  "Shot 6 mentions 'A cold blue base with intermittent crimson siren flicker'."
                ],
                "visual_inferences": [
                  "The physical police vehicle is off-screen or out of focus, but its strong flashing lights universally dictate the visual tone of the surrounding area."
                ],
                "creative_decisions": [
                  "Consistently applying the alternating blue and red strobe effects across all shots to visually anchor the urgency and shock of the moment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_approach_night_siren_arrival",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "ae9366b7728dc0bd"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "수리영의 절망적인 보고와 혜수의 도착",
        "representative_moment": "공포에 질려 눈물을 흘리며 혜수를 올려다보는 수리영(C01)의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low-angle close-up with shallow depth of field, cool night tones and vibrant siren bokeh",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition, low angle looking up. C01O02 in a navy windbreaker, a young East Asian woman, occupies the lower center in three-quarter left profile, her chin lifted, eyes looking up in shock. Standing close to her, C02O03 in a gray leather jacket, a middle-aged East Asian woman, is seen from an over-the-shoulder perspective at the upper frame edge, her hands gripping C01O02's shoulders, her chin and lower face skimming the top frame, looking down. They stand together on the [L05: wet cement stairs, the dark railing extending upward into thick night fog]. Alternating red and blue police strobe light washes across C01O02's tear-streaked cheeks and reflects under C02O03's jaw, creating soft colored bokeh in the misty background. Focus on C01O02's fearful reaction.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "Scene text: 수리영 looks up and says her mom is dead, 혜수 arrives.",
              "Shot description: Low and close in front of 수리영, looking up so 혜수's chin and lower face skim the upper edge. Red-blue siren light."
            ],
            "visual_inferences": [
              "fixed_element police_strobe_lighting adds urgency with alternating red and blue reflections.",
              "혜수 physically holding 수리영's shoulders establishes physical grounding in the tight over-the-shoulder foreground."
            ],
            "creative_decisions": [
              "Head-and-shoulder composition ensures the primary subject's face does not fill the entire frame, maintaining upper body visibility.",
              "Soft bokeh for the siren lights deepens the emotional isolation and horror of the moment."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "1a8d48c82376539c",
              "owned_hash": "da184dd47ed9e9fa",
              "camera_direction_hash": "603a29736687bcab",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 13,
        "dependency_reason": "Same continuous sequence outside the rooftop room, preserving the siren lights and fog continuity from the previous shot.",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "C02",
          "L05",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Low and close in front of 수리영, the camera finishes its inward move as a close-up (CU), low angle, looking up so 혜수's chin and lower face skim the upper edge like a looming frame. 수리영's tearful face occupies the lower center, her eyes lifted toward 혜수 while the police lights smear behind them in soft blue-red bokeh.",
            "lighting_mood": "Cold night haze is punctured by pulsing red-blue siren light that catches in 수리영's tears and under 혜수's jaw.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C02",
              "L05",
              "L06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_approach_night_siren_arrival",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_strobe_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The dark exterior environment is enveloped in cold night fog and continuously swept by pulsing red and blue police strobe lights. These harsh, alternating colored glares cut through the mist, illuminating the surroundings with a striking and urgent atmosphere.",
                "applies_to_shots": [
                  4,
                  5,
                  6
                ],
                "source_facts": [
                  "Scene text mentions sirens sounding and a police car arriving ('동시에 사이렌이 울리고~. 차에서 내린 혜수').",
                  "Shot 4 describes 'Blue-red police strobes rake across cold rooftop fog'.",
                  "Shot 5 describes 'pulsing red-blue siren light'.",
                  "Shot 6 mentions 'A cold blue base with intermittent crimson siren flicker'."
                ],
                "visual_inferences": [
                  "The physical police vehicle is off-screen or out of focus, but its strong flashing lights universally dictate the visual tone of the surrounding area."
                ],
                "creative_decisions": [
                  "Consistently applying the alternating blue and red strobe effects across all shots to visually anchor the urgency and shock of the moment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 13,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "f34f36eae14cf9a9"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "충격받은 혜수의 반응",
        "representative_moment": "수리영의 끔찍한 증언을 듣고 충격에 휩싸여 두 눈이 커진 C02의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up (CU), eye-level, clean frontal shot with shallow depth of field, cold blue tone with crimson siren flashes",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition, face occupying the center. C02O03 in a gray leather jacket, a middle-aged East Asian woman, facing the camera with widened eyes and a furrowed brow, jaw set firm, her eyes fixed on someone off-camera below. Focus on her expression of sudden shock. Intermittent crimson siren light washing one side of her cheek and jacket collar against a cold blue ambient base. [L06: soft, out-of-focus dark space wrapped in cold night fog, a blurred wet railing forming a faint silhouette line just behind her shoulder].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "Scene text: 혜수의 반응 '(놀라) 뭐?!'",
              "Shot 6 description: The reverse cut lands less than a meter from 혜수 in a close-up (CU), eye-level, clean and frontal as an emotional punctuation.",
              "DP directions: facing_camera, jaw tightening still, eyes fixed on off-camera 수리영"
            ],
            "visual_inferences": [
              "fixed_element police_strobe_lighting: intermittent crimson and cold blue police strobes reflect on her skin and jacket",
              "Head-and-shoulder composition chosen to anchor the close-up safely and avoid floating head artifacts"
            ],
            "creative_decisions": [
              "Shallow depth of field explicitly blurring the dark foggy background to isolate her shocked expression",
              "Using 'washing one side of her cheek' instead of sharp light beams to adhere to non-mutilation lighting rules"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "30aac121928bf53b",
              "owned_hash": "da184dd47ed9e9fa",
              "camera_direction_hash": "a2946dae0d2b8b29",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 13,
        "dependency_reason": "동일 공간(13씬 앞부분)의 연속이지만 close-up이므로 S13_Shot5의 차갑고 흐린 야간 사이렌 조명 톤만 유지하고 배경 참조 이미지는 무시함(skipped_close_framing).",
        "_shot_index": 6,
        "visible_entities": [
          "C02",
          "L05",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The reverse cut lands less than a meter from 혜수 in a close-up (CU), eye-level, clean and frontal as an emotional punctuation. Her widened eyes and furrowed brow sit dead center while the dark rooftop behind her falls into shallow focus, leaving only the shock of 수리영's words in the frame.",
            "lighting_mood": "A cold blue base with intermittent crimson siren flicker sharpens the fear in her eyes and brow.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "L05",
              "L06"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_approach_night_siren_arrival",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_strobe_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The dark exterior environment is enveloped in cold night fog and continuously swept by pulsing red and blue police strobe lights. These harsh, alternating colored glares cut through the mist, illuminating the surroundings with a striking and urgent atmosphere.",
                "applies_to_shots": [
                  4,
                  5,
                  6
                ],
                "source_facts": [
                  "Scene text mentions sirens sounding and a police car arriving ('동시에 사이렌이 울리고~. 차에서 내린 혜수').",
                  "Shot 4 describes 'Blue-red police strobes rake across cold rooftop fog'.",
                  "Shot 5 describes 'pulsing red-blue siren light'.",
                  "Shot 6 mentions 'A cold blue base with intermittent crimson siren flicker'."
                ],
                "visual_inferences": [
                  "The physical police vehicle is off-screen or out of focus, but its strong flashing lights universally dictate the visual tone of the surrounding area."
                ],
                "creative_decisions": [
                  "Consistently applying the alternating blue and red strobe effects across all shots to visually anchor the urgency and shock of the moment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 13,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "86c25f1147aaed4f"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "사라진 시신과 흔적, 깨끗해진 옥탑방",
        "representative_moment": "김형사의 어깨 너머로, 핏자국과 시신이 모두 사라진 깨끗한 거실을 보며 혼란에 빠진 혜수의 정면.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level over-the-shoulder medium shot with sickly fluorescent green-gray tones.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level over-the-shoulder medium shot. C04O05 in a beige jacket, a middle-aged Asian man, is positioned in the left foreground, his back and soft out-of-focus shoulder framing the edge, his face in partial profile looking toward the empty space. Across the shared entry space, C02O03 in a gray leather jacket, a young Asian woman, stands in the middle ground facing the camera, pausing mid-search, her eyes fixed on the empty living room floor from the reference. The space is unnervingly clean, with the TV from the reference emitting a dim glow. P09, a casual backpack with a small plush doll, rests quietly on the floor near the wall. Sickly fluorescent green-gray ambient light washes across the walls, while a cold blue flicker from the TV reflects on C02O03's jacket. Focus on C02O03's tense figure anchored in the spotless environment.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "김형사의 어깨 너머로 텅 빈 거실을 바라보는 혜수의 정면.",
              "S#14. 옥탑방 안: 지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
              "방을 보며 극심한 혼란을 느낌"
            ],
            "visual_inferences": [
              "fixed_element spotless_apartment_interior: eerily spotless under cold sickly interior lighting",
              "fixed_element backpack_with_doll: P09 rests quietly on the floor near the wall",
              "C04's face is rendered in partial profile to satisfy face identifiability rules for composite ID use within an OTS framing."
            ],
            "creative_decisions": [
              "Use of 'sickly fluorescent green-gray ambient light' and 'cold blue flicker' to emphasize the unnatural cleanliness of the room.",
              "Over-the-shoulder composition explicitly shares the 'entry space' to anchor both characters in the same perspective."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "54ff9ffd3afde63f",
              "owned_hash": "cd9e08476100c331",
              "camera_direction_hash": "cc7a00f0b946560d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "TV",
                  "violating_phrase": "the TV from the reference emitting a dim glow",
                  "reason": "The prompt explicitly refers to the existing TV from the reference and describes its glow, which is an anchor/reference mention rather than a request to create or modify it.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "S5_Shot14의 옥탑방 공간(bg_living_kitchen_night_cleaned_no_cups)을 exact_background로 사용하여 배경을 유지하고 현재 시점의 인물 상태를 반영함.",
        "_shot_index": 2,
        "visible_entities": [
          "C02",
          "C04",
          "P09",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From inside the rooftop room entry area, the camera holds a medium shot (MS), eye-level, over-the-shoulder behind 김형사 as his soft shoulder frames the left foreground. 혜수 faces the empty living room from the middle ground, centered against an unnervingly clean interior, while the negative space behind her makes the vanished evidence feel louder than any body.",
            "lighting_mood": "Sickly fluorescent green-gray interior light mixes with the TV's cold blue flicker, emphasizing the impossible cleanliness of the room.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "C04",
              "P09",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_living_kitchen_night_cleaned_no_cups",
            "reference_usage": "exact_background",
            "owned_objects": [
              "AC",
              "TV",
              "bathroom door",
              "bedroom door",
              "chair",
              "cooktop",
              "curtain",
              "dining table",
              "door",
              "floor cushion",
              "framed photo",
              "kitchen counter",
              "media console",
              "refrigerator",
              "shelf",
              "shoe cabinet",
              "shoe step",
              "sink",
              "sliding window",
              "sofa",
              "storage door"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "spotless_apartment_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the rooftop apartment, encompassing the living area and bedroom, is impossibly clean and meticulously organized. There are absolutely no traces of blood, no bodies, and no strange marks on any surfaces. The floors, walls, and furniture are eerily spotless under the cold, sickly interior lighting, presenting an unnerving contrast to the expected crime scene.",
                "applies_to_shots": [
                  2,
                  6,
                  8
                ],
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
                  "식탁 역시 깨끗한",
                  "unnervingly clean interior",
                  "spotless room"
                ],
                "visual_inferences": [
                  "The cleanliness is uniformly maintained across all visible areas (living room, bedroom, dining area) to emphasize the sudden and impossible disappearance of the gruesome scene."
                ],
                "creative_decisions": [
                  "The cold, sickly lighting is used to enhance the eerie feeling of the completely sanitized and empty space."
                ],
                "confidence": "high"
              },
              {
                "element_id": "backpack_with_doll",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A casual backpack with a small plush doll dangling from it rests quietly on the floor near the wall in the apartment. It remains completely stationary throughout the search, serving as a silent, slightly displaced artifact of the room's normal state before the anomalous events.",
                "applies_to_shots": [
                  2,
                  6,
                  8
                ],
                "source_facts": [
                  "수리영 방안에 놓여진 백팩, 인형. 약간씩 위치가 달라진.",
                  "등장 요소: P09(인형 달린 백팩) in shots 2, 6, 8"
                ],
                "visual_inferences": [
                  "Placed on the floor near a wall so it can be visible in the background across different framing angles without obstructing the moving characters."
                ],
                "creative_decisions": [
                  "The backpack is used as an eerie anchor to mundane reality in the otherwise impossibly cleaned room."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 14,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_living_kitchen_night_cleaned_no_cups",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "d342d8f5b2507454"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "감쪽같이 사라진 흔적",
        "representative_moment": "C01이 피와 시신이 완전히 사라진 깨끗한 옥탑방을 보며 극심한 혼란 속에서 창백하게 굳어 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level stage dolly-in to a tight CU with shallow DOF, center-right framing.",
            "t2i_prompt": "Photorealistic cinematic still. A tight head-and-shoulder composition of C01O02 in a navy windbreaker, a young East Asian woman, occupying the center-right of the frame. She is positioned at a three-quarter angle from the left, her head jerked back slightly, eyes fixed on the empty curtain corner. Focus on her wide, drained eyes and pale expression, with her neck and shoulders clearly visible at the bottom edge. Cold dawn-gray interior light washes across her face, draining her skin tone, accompanied by a faint sickly room spill. [L07: shallow depth of field blurs the impossibly clean room behind her into soft shapes. The edge of a meticulously clean bed and a closed curtain fabric edge facing the camera remain only as out-of-focus background evidence. In the distant soft blur behind her, P09, a casual backpack with a small plush doll dangling from it, rests quietly on the floor near the wall.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
              "얼굴이 파리해지는 수리영.",
              "수리영 방안에 놓여진 백팩, 인형. 약간씩 위치가 달라진."
            ],
            "visual_inferences": [
              "수리영's shock is framed closely to capture her drained, wide-eyed expression.",
              "The room's terrifying spotlessness is conveyed through soft, blurred background elements that lack any gruesome evidence.",
              "P09 and the bed remain as faint, mundane anchors in the background, contrasting with her extreme reaction."
            ],
            "creative_decisions": [
              "Employed a tight head-and-shoulder composition with a shallow depth of field to isolate C01O02 while adhering to close-framing background constraints.",
              "Used cold dawn-gray light washing across her face to emphasize her pale, bloodless shock without cutting or splitting her features."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a6ea042ecec8f9c5",
              "owned_hash": "a7f71fcf41c4d0e3",
              "camera_direction_hash": "f35e94b6b36fe3e1",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "동일한 공간(수리영의 방)에서의 연장선이나, 근접 촬영(close framing)으로 인해 배경 바인딩은 skipped_close_framing 원칙에 따라 흐릿한 심도로만 처리됨.",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "P09",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Near the foot of the bed at eye level, the camera completes the stage dolly-in into a tight CU with shallow DOF, holding 수리영’s drained face in the center-right of frame while the spotless room dissolves into blur behind her. This is a direct observer view, not her hallucination: the empty curtain corner and clean bed remain only as soft background evidence around her widened eyes.",
            "lighting_mood": "Cold dawn-gray interior light drains her skin tone, with a faint sickly room spill and no warm relief.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P09",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_daughter_bedroom_night_cleaned_rearranged",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "spotless_apartment_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the rooftop apartment, encompassing the living area and bedroom, is impossibly clean and meticulously organized. There are absolutely no traces of blood, no bodies, and no strange marks on any surfaces. The floors, walls, and furniture are eerily spotless under the cold, sickly interior lighting, presenting an unnerving contrast to the expected crime scene.",
                "applies_to_shots": [
                  2,
                  6,
                  8
                ],
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
                  "식탁 역시 깨끗한",
                  "unnervingly clean interior",
                  "spotless room"
                ],
                "visual_inferences": [
                  "The cleanliness is uniformly maintained across all visible areas (living room, bedroom, dining area) to emphasize the sudden and impossible disappearance of the gruesome scene."
                ],
                "creative_decisions": [
                  "The cold, sickly lighting is used to enhance the eerie feeling of the completely sanitized and empty space."
                ],
                "confidence": "high"
              },
              {
                "element_id": "backpack_with_doll",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A casual backpack with a small plush doll dangling from it rests quietly on the floor near the wall in the apartment. It remains completely stationary throughout the search, serving as a silent, slightly displaced artifact of the room's normal state before the anomalous events.",
                "applies_to_shots": [
                  2,
                  6,
                  8
                ],
                "source_facts": [
                  "수리영 방안에 놓여진 백팩, 인형. 약간씩 위치가 달라진.",
                  "등장 요소: P09(인형 달린 백팩) in shots 2, 6, 8"
                ],
                "visual_inferences": [
                  "Placed on the floor near a wall so it can be visible in the background across different framing angles without obstructing the moving characters."
                ],
                "creative_decisions": [
                  "The backpack is used as an eerie anchor to mundane reality in the otherwise impossibly cleaned room."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 9,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "cafde308c8ccb61e"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "김형사의 짜증과 깨끗해진 방",
        "representative_moment": "C04 looms over C01 with his hands on his waist, annoyed by the completely empty and clean room.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium low-angle over-the-shoulder shot from near the floor, sickly fluorescent lighting",
            "t2i_prompt": "Photorealistic cinematic still. A medium low-angle composition from near the floor. C01O02 in a navy windbreaker, a young East Asian woman, sits low in the extreme left foreground as an over-the-shoulder anchor, her hunched shoulder and the side of her bowed face visible, eyes looking up toward C04O05. C04O05 in a beige field jacket, a middle-aged East Asian man, looms in the center at a three-quarter angle from the right. His legs and torso rise from the lower frame, head dominating the upper-center, hands firmly on his waist, eyes looking down accusingly at C01O02. Focus on C04O05's commanding posture and the vertical tension between them. Behind them, the impossibly clean room from the reference recedes into cold shadows. The spotless dining table from the reference sits empty in the midground, and the closed door from the reference stands in the back. P09, a casual backpack with a small plush doll, rests quietly on the floor near the wall. Sickly overhead fluorescent light washes the floor and casts deep shadows on the unnervingly empty space.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "김형사: (짜증) 이봐요. 학생? 장난전화 하면 안 되는 거 몰라?",
              "수리영 방 안: 지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
              "DP: From low beside 수리영 in the living area, a static MWS low angle frames 김형사 upper-center as he looms over her, his hands-on-waist silhouette"
            ],
            "visual_inferences": [
              "fixed_element spotless_apartment_interior: eerily spotless under the cold, sickly interior lighting",
              "fixed_element backpack_with_doll: remains completely stationary... on the floor near the wall",
              "C04's imposing posture exaggerated by the low angle, creating a visual power imbalance"
            ],
            "creative_decisions": [
              "Low angle over-the-shoulder composition from the floor to geometrically align C04's full body dominance while anchoring C01 in the corner",
              "Harsh, sickly fluorescent lighting reflecting off the unnaturally clean floor to heighten the eerie absence of the crime scene"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "33d63c95b43df744",
              "owned_hash": "cd9e08476100c331",
              "camera_direction_hash": "765934081edb6589",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "dining table",
                  "violating_phrase": "The spotless dining table from the reference",
                  "reason": "The phrase references an existing dining table from the reference and does not use a redraw verb to create or add it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "The closed door from the reference",
                  "reason": "The phrase explicitly anchors the door to the reference and only describes its state, not a new creation or addition.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "Background elements must perfectly match the established room layout from the prior shot in Scene 14, using the attached background reference.",
        "_shot_index": 8,
        "visible_entities": [
          "C01",
          "C04",
          "P09",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From low beside 수리영 in the living area, a static MWS low angle frames 김형사 upper-center as he looms over her, his hands-on-waist silhouette cutting into the fluorescent haze. 수리영’s shoulder and bowed head sit low in the left foreground as an OTS pressure point, while the clean dining area recedes behind them.",
            "lighting_mood": "Sickly police-procedural fluorescent light mixes with cold apartment shadows, making 김형사 feel accusatory and 수리영 smaller.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C04",
              "P09",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_living_kitchen_night_cleaned_no_cups",
            "reference_usage": "exact_background",
            "owned_objects": [
              "AC",
              "TV",
              "bathroom door",
              "bedroom door",
              "chair",
              "cooktop",
              "curtain",
              "dining table",
              "door",
              "floor cushion",
              "framed photo",
              "kitchen counter",
              "media console",
              "refrigerator",
              "shelf",
              "shoe cabinet",
              "shoe step",
              "sink",
              "sliding window",
              "sofa",
              "storage door"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "spotless_apartment_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the rooftop apartment, encompassing the living area and bedroom, is impossibly clean and meticulously organized. There are absolutely no traces of blood, no bodies, and no strange marks on any surfaces. The floors, walls, and furniture are eerily spotless under the cold, sickly interior lighting, presenting an unnerving contrast to the expected crime scene.",
                "applies_to_shots": [
                  2,
                  6,
                  8
                ],
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
                  "식탁 역시 깨끗한",
                  "unnervingly clean interior",
                  "spotless room"
                ],
                "visual_inferences": [
                  "The cleanliness is uniformly maintained across all visible areas (living room, bedroom, dining area) to emphasize the sudden and impossible disappearance of the gruesome scene."
                ],
                "creative_decisions": [
                  "The cold, sickly lighting is used to enhance the eerie feeling of the completely sanitized and empty space."
                ],
                "confidence": "high"
              },
              {
                "element_id": "backpack_with_doll",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A casual backpack with a small plush doll dangling from it rests quietly on the floor near the wall in the apartment. It remains completely stationary throughout the search, serving as a silent, slightly displaced artifact of the room's normal state before the anomalous events.",
                "applies_to_shots": [
                  2,
                  6,
                  8
                ],
                "source_facts": [
                  "수리영 방안에 놓여진 백팩, 인형. 약간씩 위치가 달라진.",
                  "등장 요소: P09(인형 달린 백팩) in shots 2, 6, 8"
                ],
                "visual_inferences": [
                  "Placed on the floor near a wall so it can be visible in the background across different framing angles without obstructing the moving characters."
                ],
                "creative_decisions": [
                  "The backpack is used as an eerie anchor to mundane reality in the otherwise impossibly cleaned room."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_living_kitchen_night_cleaned_no_cups",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "45ff7d12b893bef9"
      },
      {
        "scene_index": 15,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "엄마가 그런 일을 당했을 리 없다고 생각하며 급히 집으로 향하려 일어나는 수리영",
        "representative_moment": "C01이 음료를 무시한 채 벤치에서 벌떡 일어나며 안개 낀 도로를 향해 시선을 던진다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium shot at chest height, muted blue-gray coastal night haze",
            "t2i_prompt": "Photorealistic cinematic still. Medium shot at chest height. C01O02 in a navy windbreaker, a young Asian woman, is caught mid-rise from a damp bus-stop bench on the right third of the frame, body at a three-quarter angle from the right, eyes fixed on the foggy road ahead. At the left edge, the partial arm of a middle-aged Asian woman extends an unopened can drink across the air over the shared bench. Muted blue-gray coastal night haze flattens the scene, with weak streetlight glinting off the damp bench surface and the metallic can. The cold sea mist heavily blankets the environment, obscuring the empty coastal road behind her. A damp, faded bus stop sign stands in the background, its face angled partly toward the camera. Focus on the young woman's tense mid-rise posture against the desaturated, moody fog.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "수리영(C01)이 훅 일어나며 집에 가봐야겠다고 함",
              "혜수가 사온 음료수를 수리영에게 건네는 상황",
              "At chest height from the front-left corner of the bus-stop bench, a held MS eye-level composition lets 수리영’s sudden rise become the only violent motion in frame",
              "The offered can and 혜수’s partial arm remain at the left edge",
              "수리영 lifts from the bench on the right third and turns toward the foggy road"
            ],
            "visual_inferences": [
              "fixed_element coastal_night_atmosphere: A cold, blue-gray coastal night environment heavily blanketed in sea mist, dimly lit by sparse, weak roadside streetlights",
              "fixed_element damp_bus_stop_bench: A standard roadside bus stop bench situated near the misty road, damp surface faintly catches light",
              "Unregistered extra (혜수) is represented merely as the arm of a middle-aged Asian woman to maintain focus on the main character's motion"
            ],
            "creative_decisions": [
              "Placed the main character on the right third of the frame while the extended arm occupies the left edge, creating a clear fg/bg interaction over the shared bench anchor",
              "Used 'caught mid-rise' to express the violent, sudden motion of standing up while preserving the static nature of a still image",
              "Emphasized the muted blue-gray color palette and fog diffusion to anchor the cold, mysterious mood of the coastal night"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e1ec0a2b0f7536c0",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a89375ffbf9ffefd",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency specified in the current context.",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "L14"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height from the front-left corner of the bus-stop bench, a held MS eye-level composition lets 수리영’s sudden rise become the only violent motion in frame. The offered can and 혜수’s partial arm remain at the left edge, while 수리영 lifts from the bench on the right third and turns toward the foggy road.",
            "lighting_mood": "Muted blue-gray coastal night haze flattens the scene, with weak streetlight glinting off the damp bench and can.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L14"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "coastal_night_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A cold, blue-gray coastal night environment heavily blanketed in sea mist. The area is dimly lit by sparse, weak roadside streetlights, creating a desaturated, moody, and damp overall atmosphere.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "source_facts": [
                  "Muted blue-gray coastal night haze flattens the scene",
                  "weak streetlight glinting",
                  "Cold sea mist and sparse roadside light create a predatory, desaturated image"
                ],
                "visual_inferences": [
                  "The heavy mist diffuses the artificial street lighting, significantly reducing background visibility and color saturation."
                ],
                "creative_decisions": [
                  "Maintain a consistent cool color palette (blue-gray) and foggy diffusion across both framings to anchor the spatial continuity of the coastal road."
                ],
                "confidence": "high"
              },
              {
                "element_id": "damp_bus_stop_bench",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A standard roadside bus stop bench situated near the misty road. Its damp surface faintly catches and reflects the weak specular light from the nearby streetlamp.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "source_facts": [
                  "weak streetlight glinting off the damp bench",
                  "front-left corner of the bus-stop bench",
                  "stays near the bus stop in the midground"
                ],
                "visual_inferences": [
                  "The bench remains a stationary physical anchor point in the environment, marking the exact location where the interaction began."
                ],
                "creative_decisions": [
                  "Ensure the bench has a noticeable sheen from the coastal moisture to enhance the tactile, cold feeling of the night setting."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "665c40ed46b479e5"
      },
      {
        "scene_index": 15,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "수리영의 급작스런 이탈과 몰래 지켜보는 시선",
        "representative_moment": "정체불명의 관찰자가 수풀 사이로, 급히 달려가는 C01과 뒤에 남아 손을 뻗어 부르는 C02를 몰래 지켜보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low-angle voyeuristic POV from inside coastal bushes, deep focus, desaturated cold blue-gray color palette",
            "t2i_prompt": "Photorealistic cinematic still. Low observer at ground level, wet coastal leaves partially occluding the lower and side frame edges in dark silhouette. Focus on the dark foreground leaves framing the two figures, emphasizing the voyeuristic surveillance. Through the gap in the bushes, C02O03 in a gray leather jacket, a middle-aged Asian woman, stands near a damp bus stop bench in the midground, back to the camera, head turned slightly in right profile with eyes fixed on the distant figure, one arm raised calling out. Further down the misty coastal road they both occupy, C01O02 in a navy windbreaker, a young Asian woman, is caught mid-stride, back to the camera, head turned slightly in left profile with eyes directed toward the distant fog, one leg lifted off the ground, hair flowing back in the direction opposite to motion. A cold, blue-gray sea mist heavily blankets the environment, diffusing the weak specular light from the nearby streetlamp and creating a predatory, desaturated atmosphere.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S15 action: '수리영, 응. 나 갈게 (달려간다)'",
              "S15 action: '혜수 (등 뒤에 대고 소리친다) 엄마 보면 나한테 전화 하라고 해!'",
              "S15 action: '두 사람을 지켜보는 듯한 카메라 시선.'",
              "shot description: From a low hidden position inside the coastal bushes, voyeur’s direct first-person surveillance view"
            ],
            "visual_inferences": [
              "fixed_element coastal_night_atmosphere: cold blue-gray sea mist and weak streetlights",
              "fixed_element damp_bus_stop_bench: catching specular light in the midground",
              "low-angle voyeuristic framing uses wet foreground leaves to emphasize the hidden observer's tension"
            ],
            "creative_decisions": [
              "Placed both characters sharing 'the misty coastal road they both occupy' as a spatial anchor for foreground/background separation.",
              "Added slight profile turns to both characters to satisfy face identifiability rules for C## composite IDs while preserving their back-to-camera narrative action.",
              "Froze C01 mid-stride with hair flowing backward to preserve motion direction without using blurring."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "db03cf04e052e1a6",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "e5d19daff9af5dfb",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 15,
        "dependency_reason": "Shot 3의 해안가 버스정류장 배경과 안개 낀 밤의 분위기(exact_background)를 유지하며 카메라 앵글을 수풀 안쪽 1인칭 시점으로 변경",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "C02",
          "L14"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a low hidden position inside the coastal bushes, a handheld WS low angle uses through-object framing as leaves partially occlude the lower and side edges of the image. This is an unidentified voyeur’s direct first-person surveillance view: 혜수 stays near the bus stop in the midground while 수리영 is caught farther away mid-stride, back to camera, one leg lifted toward the road.",
            "lighting_mood": "Cold sea mist and sparse roadside light create a predatory, desaturated image with dark leaf silhouettes in the foreground.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C02",
              "L14"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "coastal_night_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A cold, blue-gray coastal night environment heavily blanketed in sea mist. The area is dimly lit by sparse, weak roadside streetlights, creating a desaturated, moody, and damp overall atmosphere.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "source_facts": [
                  "Muted blue-gray coastal night haze flattens the scene",
                  "weak streetlight glinting",
                  "Cold sea mist and sparse roadside light create a predatory, desaturated image"
                ],
                "visual_inferences": [
                  "The heavy mist diffuses the artificial street lighting, significantly reducing background visibility and color saturation."
                ],
                "creative_decisions": [
                  "Maintain a consistent cool color palette (blue-gray) and foggy diffusion across both framings to anchor the spatial continuity of the coastal road."
                ],
                "confidence": "high"
              },
              {
                "element_id": "damp_bus_stop_bench",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A standard roadside bus stop bench situated near the misty road. Its damp surface faintly catches and reflects the weak specular light from the nearby streetlamp.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "source_facts": [
                  "weak streetlight glinting off the damp bench",
                  "front-left corner of the bus-stop bench",
                  "stays near the bus stop in the midground"
                ],
                "visual_inferences": [
                  "The bench remains a stationary physical anchor point in the environment, marking the exact location where the interaction began."
                ],
                "creative_decisions": [
                  "Ensure the bench has a noticeable sheen from the coastal moisture to enhance the tactile, cold feeling of the night setting."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 15,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "cdaa3cfd8efebe9a"
      },
      {
        "scene_index": 16,
        "heading": "S#16. 경찰서 사무실 / N",
        "beat_title": "불길한 예감과 위치 추적 요구",
        "representative_moment": "혜수의 손이 핸드폰 화면을 김형사의 모니터 앞으로 불쑥 내민다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight close framing, slight Dutch angle, at desk height, sickly green-blue fluorescent lighting",
            "t2i_prompt": "Photorealistic cinematic still. A smartphone screen dominates the center-left frame, angled slightly in a Dutch tilt. The gripping fingers and grey leather sleeve of a young East Asian woman enter from the left edge, holding the device tightly across a cluttered desk surface. Focus on the illuminated phone display showing digits. In the softly blurred background across the desk, a middle-aged East Asian man in a beige field jacket sits hunched behind a glowing computer monitor, his gaze directed toward the phone. Sickly green-blue fluorescent light reflects off the phone glass and the knuckles of the gripping hand. The monitor screen casts a cold, bureaucratic glow that washes the blurred man's upper body and the scattered papers on the desk.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 4: 김형사의 모니터 앞으로 내밀어진 혜수의 핸드폰 액정 화면 클로즈업",
              "Sickly fluorescent office light reflects green-blue off the phone glass",
              "monitor adding a cold bureaucratic glow",
              "desk line traps the space between them"
            ],
            "visual_inferences": [
              "Hye-su's face is out of frame, represented entirely by her gripping hand and sleeve due to the tight framing",
              "Det. Kim is an out-of-focus background element behind the monitor",
              "The cluttered desk acts as the physical shared anchor separating the foreground hand and background figure"
            ],
            "creative_decisions": [
              "Replaced C02O03 and C04O05 with common nouns and demographic descriptors to comply with the strict body-part focus rule on the hand/phone",
              "Used a soft blur on Det. Kim to maintain the phone screen as the sole fully visible primary subject in close framing",
              "Translated the 'tight CU' DP instruction into a geometrical description where the phone occupies the center-left frame"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d55133e7d1958bbf",
              "owned_hash": "6aa2365bedec5d16",
              "camera_direction_hash": "e1ff54441110edbe",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 4,
        "visible_entities": [
          "C02",
          "C04",
          "P05",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At desk height directly in front of 김형사’s monitor, a tight CU slight Dutch angle frames 혜수’s phone screen as a through-device insert, the display occupying just under two-fifths of the frame with the monitor plane blurred behind it. 혜수’s sleeve and gripping fingers enter from the left, while 김형사 is only a soft, skeptical presence beyond the screen.",
            "lighting_mood": "Sickly fluorescent office light reflects green-blue off the phone glass, with the monitor adding a cold bureaucratic glow.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "C04",
              "P05",
              "L15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_office_night_duty_normal",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_office_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a police station office at night, heavily illuminated by harsh, sickly green-blue fluorescent lights. A standard office desk equipped with a softly glowing computer monitor serves as the central workspace, creating a cold, bureaucratic, and airless atmosphere.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "Sickly fluorescent office light reflects green-blue",
                  "monitor adding a cold bureaucratic glow",
                  "Harsh fluorescent green-blue light makes the police office feel airless",
                  "desk line traps the space between them"
                ],
                "visual_inferences": [
                  "The desk is a typical police station night-duty setup with a monitor acting as a physical barrier between the detective and the civilian"
                ],
                "creative_decisions": [
                  "Consistent green-blue color grading across both shots to emphasize the tense and unhealthy night-shift environment"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "fbd21d09aa38eaf4"
      },
      {
        "scene_index": 16,
        "heading": "S#16. 경찰서 사무실 / N",
        "beat_title": "김형사에게 위치 추적을 압박하는 혜수",
        "representative_moment": "책상을 짚고 몸을 숙인 C02가 의자에 앉은 C04를 강하게 압박하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium shot from a low standing height, harsh green-blue fluorescent lighting",
            "t2i_prompt": "Photorealistic cinematic still. Medium shot from a low standing height. C02O03 in a gray leather jacket, a young East Asian woman, positioned at three-quarter left angle, leaning aggressively forward into the frame, both hands planted hard on the edge of the desk from the reference, her jaw tense, eyes fixed on C04O05. C04O05 in a beige field jacket, a middle-aged East Asian man, occupies the right foreground in over-the-shoulder view, slumping in the chair from the reference, his head turned to look back at her. The desk from the reference acts as a physical barrier trapping the space between them, holding a softly glowing monitor from the reference with its back panel partly visible. Harsh green-blue ambient light from the fluorescent light from the reference washes over the characters, creating a cold, airless tension. Focus on the space across the shared desk dividing the two figures.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "S16 action: 혜수가 김형사에게 핸드폰 번호를 보여주며 위치 추적을 압박함",
              "Shot description: 책상 짚은 양손에 힘을 준 채 김형사를 향해 상체를 숙인 혜수의 정지 구도"
            ],
            "visual_inferences": [
              "fixed_element police_office_night_environment: green-blue fluorescent lights, glowing monitor acting as a barrier",
              "김형사는 오른쪽 전경에서 OTS(Over-The-Shoulder) 구도로 의자에 기대 앉아있음"
            ],
            "creative_decisions": [
              "Medium shot from a low standing height to emphasize Hye-su's urgency and physical pressure over the desk",
              "Harsh green-blue color grading to enhance the cold, airless night-shift mood and tension between the characters",
              "Background elements strictly anchored to the exact_background reference using 'from the reference'"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "fb3e483049280e66",
              "owned_hash": "6aa2365bedec5d16",
              "camera_direction_hash": "c150bd7ec7c581df",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "desk",
                  "violating_phrase": "desk from the reference",
                  "reason": "The desk is mentioned as an existing referenced object and used as a spatial anchor, not as something newly created or added.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "desk",
                  "violating_phrase": "the desk",
                  "reason": "The desk functions as an existing barrier and framing element, which is an anchor reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "monitor",
                  "violating_phrase": "monitor from the reference",
                  "reason": "The monitor is referenced as already present in the scene and described only by state/placement, not newly generated.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "fluorescent light from the reference",
                  "reason": "The fluorescent light is explicitly referenced from the existing background, so this is an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "exact_background rule applies to maintain the police office environment established in S16_Shot4",
        "_shot_index": 6,
        "visible_entities": [
          "C02",
          "C04",
          "P05",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Across the desk from 혜수 at low standing height, a static MWS low angle holds her leaning into the frame, both hands planted hard on the desk edge in the foreground. 김형사 sits partly right of frame as an OTS counterweight, while the desk line traps the space between them like an interrogation barrier.",
            "lighting_mood": "Harsh fluorescent green-blue light makes the police office feel airless, sharpening the tension in 혜수’s hands and jaw.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "C04",
              "P05",
              "L15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_office_night_duty_normal",
            "reference_usage": "exact_background",
            "owned_objects": [
              "PC",
              "blind",
              "box",
              "chair",
              "coat rack",
              "copier",
              "corridor",
              "desk",
              "door",
              "evidence board",
              "file cabinet",
              "fluorescent light",
              "map board",
              "monitor",
              "partition",
              "phone",
              "printer",
              "table",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_office_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a police station office at night, heavily illuminated by harsh, sickly green-blue fluorescent lights. A standard office desk equipped with a softly glowing computer monitor serves as the central workspace, creating a cold, bureaucratic, and airless atmosphere.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "Sickly fluorescent office light reflects green-blue",
                  "monitor adding a cold bureaucratic glow",
                  "Harsh fluorescent green-blue light makes the police office feel airless",
                  "desk line traps the space between them"
                ],
                "visual_inferences": [
                  "The desk is a typical police station night-duty setup with a monitor acting as a physical barrier between the detective and the civilian"
                ],
                "creative_decisions": [
                  "Consistent green-blue color grading across both shots to emphasize the tense and unhealthy night-shift environment"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_office_night_duty_normal",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "600beb02c175690c"
      },
      {
        "scene_index": 17,
        "heading": "S#17. 옥탑방 / 동틀무렵",
        "beat_title": "새벽 안개 속 희미하게 빛나는 옥탑방 창문",
        "representative_moment": "어스름한 새벽 안개 속, 이웃집 옥상 너머로 불 켜진 옥탑방 창문이 고요하고 기괴하게 빛난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Static establishing wide shot from a neighboring rooftop at eye level, cold dim blue fog with contrasting warm yellow window glow",
            "t2i_prompt": "Photorealistic cinematic still. From a neighboring rooftop at eye level, an establishing wide view looking across a shadowed narrow alley. Enveloped in a cold, dim blue pre-sunrise fog, creating a quiet occult unease. The dark, damp concrete parapet from the reference runs across the foreground edge. In the distance, the stairwell headhouse from the reference and the rectangular window from the reference sit slightly above center. Focus on the faint, warm yellow glow emitting from the window from the reference, suspended in the sparse dawn-gray composition and contrasting sharply with the cold surrounding haze.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: 새벽녘, 불이 켜져 있는 옥탑 방",
              "Shot 1: 어스름한 새벽빛 아래 희미하게 불이 켜진 옥탑방 창문의 원경 구도",
              "DP instruction: static EWS from a neighboring rooftop at eye level across the alley"
            ],
            "visual_inferences": [
              "fixed_element dawn_rooftop_atmosphere: cold, dim blue fog and a rough concrete parapet wall",
              "The warm yellow light is the sole focal point in a predominantly cold, sparse composition",
              "The black cat is omitted to strictly follow the ID removal request, focusing entirely on the eerie architectural stillness"
            ],
            "creative_decisions": [
              "Anchored background elements with 'from the reference' (parapet, headhouse, window) to comply with exact_background owned_objects constraints",
              "Used heavy pale blue-gray atmospheric veil to enhance the occult horror tone without relying on explicit supernatural figures"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "47ab550f3cdbc853",
              "owned_hash": "c2336a1fc231169c",
              "camera_direction_hash": "ec4197214fc553fa",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "parapet",
                  "violating_phrase": "The dark, damp concrete parapet from the reference",
                  "reason": "The owned object is mentioned with an explicit reference phrase, so it is treated as an existing background anchor rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stairwell headhouse",
                  "violating_phrase": "the stairwell headhouse from the reference",
                  "reason": "The phrase explicitly says it is from the reference, which anchors the existing object instead of instructing a new one to be created.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "the rectangular window from the reference",
                  "reason": "The object is directly tied to the reference, so this is an anchor_reference mention and not a redraw command.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "the window from the reference",
                  "reason": "The object is again referenced as already existing in the scene, which makes it an anchor_reference mention.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "S4_Shot1의 옥탑방 배경 레퍼런스를 exact_background로 사용하여, 동일한 공간이 새벽빛으로 전환된 정적이고 을씨년스러운 분위기를 연속적으로 표현",
        "_shot_index": 1,
        "visible_entities": [
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 17,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a neighboring rooftop at eye level, a static EWS establishes the rooftop room window as a small warm rectangle suspended in a sparse dawn-gray composition across the alley. The lit window sits slightly above center, with empty parapet lines and haze taking most of the frame in a long take implied stillness.",
            "lighting_mood": "Dim pre-sunrise blue haze surrounds the faint yellow window glow, creating a quiet occult unease.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C12",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_rooftop_dawn_window_lit_cat",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cat",
              "door",
              "laundry line",
              "parapet",
              "post",
              "roof drain",
              "roof terrace",
              "stairwell headhouse",
              "wall light",
              "water tank",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dawn_rooftop_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pre-sunrise dawn setting enveloped in a cold, dim blue fog. A textured concrete parapet wall runs across the space. In the distance, a small rooftop structure features a single rectangular window that emits a faint, warm yellow glow, contrasting sharply with the cold surrounding haze.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "source_facts": [
                  "Scene text: 새벽녘 (dawn)",
                  "Shot 1: Dim pre-sunrise blue haze surrounds the faint yellow window glow, empty parapet lines",
                  "Shot 3: cold dawn rim light, dawn fog as soft peripheral detail, wall texture, window reflection burns as a tiny sick yellow point"
                ],
                "visual_inferences": [
                  "The parapet wall is made of rough, aged concrete typical for older urban villa rooftops in Korea",
                  "The yellow light from the window is the only warm light source in the predominantly cold blue environment"
                ],
                "creative_decisions": [
                  "Maintain the stark color contrast between the ambient cold blue dawn fog and the warm yellow window light as the primary visual anchor across different framing scales"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C12O00",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_rooftop_dawn_window_lit_cat",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "bfa46be608101e05"
      },
      {
        "scene_index": 17,
        "heading": "S#17. 옥탑방 / 동틀무렵",
        "beat_title": "검은 고양이의 눈동자에 비친 옥탑방",
        "representative_moment": "검은 고양이의 눈동자 속에 불 켜진 옥탑방 창문이 작고 기괴하게 비친다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "ECU worm's eye reflection shot, cold dawn blue with sick yellow contrast",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up worm's eye reflection shot. Focus on the glossy eye of a black cat in right profile. The dark eye occupies most of the frame. A tiny catchlight of a faintly lit rooftop window burns as a sick yellow point reflected inside the pupil. Cold dawn rim light traces the wet-looking black fur around the eye. At the bottom edge, [L04: an out-of-focus rough damp concrete parapet wall] provides a scale reference. The periphery fades into soft, cold blue-gray dawn fog.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: 새벽녘 (dawn), 검은 고양이가 불이 켜져 있는 옥탑 방을 슬쩍 보더니",
              "Shot 3 description: ECU worm's eye reflection shot aligned with one eye of 검은 고양이. The glossy eye occupies most of the human-scale close-up allowance while a tiny catchlight of the lit rooftop window trembles inside it"
            ],
            "visual_inferences": [
              "fixed_element dawn_rooftop_atmosphere: cold dim blue fog, rough concrete parapet wall",
              "The cat is crouched on the concrete wall in right profile, looking up at the window"
            ],
            "creative_decisions": [
              "Excluded the character ID (C12) in the prompt text per body_part_focus_rule and reproduction_surface_rule, using a common noun ('black cat') to prevent face reference injection anomalies",
              "Used tight framing to emphasize the sick yellow reflection against the cold blue dawn fog"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "3f8435f3d21a1d2c",
              "owned_hash": "c2336a1fc231169c",
              "camera_direction_hash": "be5ea07316c2ea43",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 17,
        "dependency_reason": "Shot 1 established the cold dawn atmosphere and the yellow window light, which is now carried over as a reflection in the cat's eye.",
        "_shot_index": 3,
        "visible_entities": [
          "C12",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 17,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Very low on the wall, the dolly-in resolves into an ECU worm's eye reflection shot aligned with one eye of 검은 고양이. The glossy eye occupies most of the human-scale close-up allowance while a tiny catchlight of the lit rooftop window trembles inside it, leaving fur, wall texture, and dawn fog as soft peripheral detail.",
            "lighting_mood": "A cold dawn rim light outlines the cat’s black fur while the window reflection burns as a tiny sick yellow point in the eye.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C12",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C12",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_rooftop_dawn_window_lit_cat",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dawn_rooftop_atmosphere",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pre-sunrise dawn setting enveloped in a cold, dim blue fog. A textured concrete parapet wall runs across the space. In the distance, a small rooftop structure features a single rectangular window that emits a faint, warm yellow glow, contrasting sharply with the cold surrounding haze.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "source_facts": [
                  "Scene text: 새벽녘 (dawn)",
                  "Shot 1: Dim pre-sunrise blue haze surrounds the faint yellow window glow, empty parapet lines",
                  "Shot 3: cold dawn rim light, dawn fog as soft peripheral detail, wall texture, window reflection burns as a tiny sick yellow point"
                ],
                "visual_inferences": [
                  "The parapet wall is made of rough, aged concrete typical for older urban villa rooftops in Korea",
                  "The yellow light from the window is the only warm light source in the predominantly cold blue environment"
                ],
                "creative_decisions": [
                  "Maintain the stark color contrast between the ambient cold blue dawn fog and the warm yellow window light as the primary visual anchor across different framing scales"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 17,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C12O00",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "afd71c934e4b8288"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "사라진 엄마의 흔적",
        "representative_moment": "고양이 울음소리에 번쩍 눈을 뜨고 고개를 치켜든 C01의 놀란 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle head-and-shoulder composition, shallow depth of field with a sickly green-gray tint",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition from a low angle looking up at the figure. C01O02 in a navy windbreaker, a young East Asian woman, head raised sharply at a three-quarter angle from the right, eyes wide and fixed on an off-frame doorway. Her shoulders and upper chest occupy the lower frame, with rumpled bedding visible at the very bottom edge. A dim headboard rests close behind her shoulders. The [L07: soft out-of-focus dim bedroom wall] extends upward into the top frame behind her. Pale, weak daylight from an off-frame window seeps across her features, leaving her face pallid against a pervasive, sickly green-gray interior ambient tint.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot description: 두 눈을 번쩍 뜬 채 고개를 치켜든 수리영의 놀란 얼굴 클로즈업.",
              "Beat #1: 고양이 울음소리에 깨어 엄마가 집에 돌아왔는지 기대하며 방을 살핌.",
              "Lighting instruction: Thin daylight seeps in cold and gray, leaving her face pallid with a faint undercurrent of sleepless exhaustion."
            ],
            "visual_inferences": [
              "fixed_element cold_gray_interior_lighting: pervasive cold and gray lighting condition casting a pale, sickly green-gray tone over the surroundings.",
              "Rumpled bedding at the bottom edge and a dim headboard are inferred to anchor the bedside location within a tight frame without revealing the wider room."
            ],
            "creative_decisions": [
              "Used 'Head-and-shoulder composition' from a low angle to comply with the camera_frame_rule and prevent the T2I model from generating a floating, detached face.",
              "Employed a soft out-of-focus background wall [L07] to adhere to the skipped_close_framing background binding policy, isolating the character's reaction."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "41e2e9a3171d1559",
              "owned_hash": "eb0ef19840d12bce",
              "camera_direction_hash": "f0799f30d183ac45",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "S14_Shot6의 배경(옥탑방) 연속성을 유지하되, 현재 샷은 skipped_close_framing이 적용되어 직접적인 배경 참조를 생략하고 프레임 엣지 표면 묘사로 대체함.",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "P05",
          "P09",
          "P10",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Low at the bedside from the foot side of the bed, the camera finishes an abrupt dolly-in into a CU low angle on 수리영 snapping awake and lifting her head. Her face lands center frame with the headboard and bedding falling out of focus behind her, turning the cat’s cry into a physical jolt rather than a visible source.",
            "lighting_mood": "Thin daylight seeps in cold and gray, leaving her face pallid with a faint undercurrent of sleepless exhaustion.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P05",
              "P09",
              "P10",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_master_bedroom_dawn_waiting_empty_home",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_gray_interior_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pervasive cold and gray lighting condition that fills the interior spaces. The light casts a pale, sickly, and slightly green-gray tone over the surroundings, creating an eerie, unnatural, and chilling atmosphere across the different rooms.",
                "applies_to_shots": [
                  2,
                  12,
                  15
                ],
                "source_facts": [
                  "Shot 2: 'Thin daylight seeps in cold and gray'",
                  "Shot 12: 'Cold fluorescent bathroom light turns the glass green-gray'",
                  "Shot 15: 'Cold gray daylight mixes with a sickly interior cast'"
                ],
                "visual_inferences": [
                  "A unified desaturated color palette with cold tones to visually connect the different rooms (bedroom, bathroom, dining area) throughout the sequence."
                ],
                "creative_decisions": [
                  "Applying a sickly green-gray tint to the overall ambient light to foreshadow and emphasize the character's psychological instability and the supernatural hallucinations."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "2792d0d7842d41bd"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "환영의 발현",
        "representative_moment": "거울 표면에 선명하게 떠오른 붉은 원형 표식.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At face height, close-up Dutch angle on the bathroom mirror, focusing on the hallucinated red mark with sickly green-gray fluorescent lighting.",
            "t2i_prompt": "Photorealistic cinematic still. Focus on a sharp-edged, bright crimson circular mark appearing on the slightly wet, streaked surface of a bathroom mirror. The camera is positioned at face height in a close-up Dutch angle, framing only the glass and its reflection. Ghosted behind the supernatural red sign is the reflection of [L07: a pale, damp tiled wall]. At the very bottom edge of the frame, a slice of a wet white ceramic sink anchors the composition. A pervasive cold, sickly green-gray fluorescent ambient light washes over the reflected tiles, providing a stark, chilling contrast to the vibrant red mark.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 12 description: 욕실 거울 표면 위로 선명하게 떠오른 붉은 원형 표식의 클로즈업",
              "Scene text: 거울에 비친 욕실 벽에 갑자기 또 발생하는 붉은 원"
            ],
            "visual_inferences": [
              "fixed_element cold_gray_interior_lighting: pervasive cold green-gray tone",
              "Character's reflection is intentionally reduced out of the tight frame to isolate the supernatural mark",
              "Wet sink edge at the bottom frame acts as a physical spatial anchor"
            ],
            "creative_decisions": [
              "Dutch angle close-up to induce a sense of psychological disorientation",
              "High contrast between the sickly green-gray reflection and the bright crimson mark to emphasize the supernatural horror"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "c4b9c0163e86dc74",
              "owned_hash": "a65185601a83e11d",
              "camera_direction_hash": "a6c42418a86b5ee0",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "Sharing the same cold, gray interior lighting tone established in the prior shots of the sequence.",
        "_shot_index": 12,
        "visible_entities": [
          "P05",
          "P09",
          "P10",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At face height, nearly perpendicular to the bathroom mirror, a static CU Dutch angle locks onto the glass surface as a crimson circular mark appears in the central third of frame. This is a hallucination seen via reflection: 수리영’s reflection is reduced out of frame, leaving the sink edge below and tiled wall ghosted behind the impossible red sign.",
            "lighting_mood": "Cold fluorescent bathroom light turns the glass green-gray while the red circle cuts through as a sick, supernatural accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P05",
              "P09",
              "P10",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_bathroom_dawn_mirror_red_circle_hallucination",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_gray_interior_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pervasive cold and gray lighting condition that fills the interior spaces. The light casts a pale, sickly, and slightly green-gray tone over the surroundings, creating an eerie, unnatural, and chilling atmosphere across the different rooms.",
                "applies_to_shots": [
                  2,
                  12,
                  15
                ],
                "source_facts": [
                  "Shot 2: 'Thin daylight seeps in cold and gray'",
                  "Shot 12: 'Cold fluorescent bathroom light turns the glass green-gray'",
                  "Shot 15: 'Cold gray daylight mixes with a sickly interior cast'"
                ],
                "visual_inferences": [
                  "A unified desaturated color palette with cold tones to visually connect the different rooms (bedroom, bathroom, dining area) throughout the sequence."
                ],
                "creative_decisions": [
                  "Applying a sickly green-gray tint to the overall ambient light to foreshadow and emphasize the character's psychological instability and the supernatural hallucinations."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "a72aaf112faad1bd"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "사진 속 기괴한 환영",
        "representative_moment": "식탁 위 액자에 담긴 40대 여성의 얼굴이 기괴하게 녹아내린다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up high-angle subjective POV, cold gray and sickly green-gray ambient with sharp crimson-brown accents",
            "t2i_prompt": "Photorealistic cinematic still. A close-up, high-angle subjective view from dining-table height, focused on an upright framed photograph standing on a cold, bare table. Inside the photograph, the portrait of a middle-aged East Asian woman facing the camera is grotesquely distorted, her facial features melting and streaking downward with sharp, unnatural crimson-brown accents. A half-full drinking glass with faint condensation is heavily blurred in the left foreground. Pervasive cold gray daylight mixes with a sickly green-gray cast across the table surface, capturing the hallucinated surface event in the central third of the frame.",
            "outfit_assignments": [],
            "source_facts": [
              "S#18 action: '식탁에 놓인 엄마와 수리영의 사진을 보는데... 환하게 웃는 엄마 얼굴이 뭉개져 흘러내린다'",
              "shot description: Subjective POV from 수리영 at dining-table height, frozen insert on the upright framed photograph, drinking glass blurred at the left foreground"
            ],
            "visual_inferences": [
              "fixed_element environment_state: cold_gray_interior_lighting casts a pale, sickly green-gray tone over the table surface",
              "The photograph rests on a bare dining table, which acts as the only visible frame-edge surface in this skipped-background close-framing setup"
            ],
            "creative_decisions": [
              "Applying heavy foreground blur to the drinking glass to establish the subjective POV depth while keeping the melting photograph sharply focused in the center",
              "Using sharp crimson-brown accents on the melting facial features to provide a disturbing contrast against the cold, desaturated green-gray ambient"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "75230a1a2719f446",
              "owned_hash": "f46489d405a4bd51",
              "camera_direction_hash": "1bf4c911c03fd123",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "Shot 12에서 설정된 차갑고 병적인 색감(cold gray and sickly green-gray tone)을 유지하며 환각적 분위기 연속성 보존",
        "_shot_index": 15,
        "visible_entities": [
          "P05",
          "P09",
          "P10",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 15
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Subjective POV from 수리영 at dining-table height: a CU, high angle, frozen insert holds on the upright framed photograph near the right-center of the table, with the drinking glass blurred at the left foreground and the frame kept to roughly the central third. The camera inherits the lateral table move but stops dead as the mother's portrait appears to liquefy behind the glass, turning a family snapshot into a hallucinated surface event.",
            "lighting_mood": "Cold gray daylight mixes with a sickly interior cast, while the melted facial streaks carry a sharp, unnatural crimson-brown accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P05",
              "P09",
              "P10",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_dawn_photo_hallucination",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_gray_interior_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pervasive cold and gray lighting condition that fills the interior spaces. The light casts a pale, sickly, and slightly green-gray tone over the surroundings, creating an eerie, unnatural, and chilling atmosphere across the different rooms.",
                "applies_to_shots": [
                  2,
                  12,
                  15
                ],
                "source_facts": [
                  "Shot 2: 'Thin daylight seeps in cold and gray'",
                  "Shot 12: 'Cold fluorescent bathroom light turns the glass green-gray'",
                  "Shot 15: 'Cold gray daylight mixes with a sickly interior cast'"
                ],
                "visual_inferences": [
                  "A unified desaturated color palette with cold tones to visually connect the different rooms (bedroom, bathroom, dining area) throughout the sequence."
                ],
                "creative_decisions": [
                  "Applying a sickly green-gray tint to the overall ambient light to foreshadow and emphasize the character's psychological instability and the supernatural hallucinations."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "shot_index": 12,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5fd3aef3cab4cd2f"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "마트 직원과의 조우와 단서 확보",
        "representative_moment": "C01 blocks the path of C06 in the supermarket aisle to ask about her mother's actions.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium wide two-shot, chest height, flat pale blue-gray fluorescent wash",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level medium wide two-shot at chest height in the supermarket aisle from the reference. C01O02 in a navy windbreaker, a young Asian woman, stands in the left-middle frame at a three-quarter angle from the right, blocking the path. C06O08 in a red uniform, a middle-aged Asian man, stands in the right-middle frame at a three-quarter angle from the left, clutching stacked paper boxes high against his chest. The boxes create a rigid barrier crossing the air between them. C01O02's eyes are fixed on C06O08; C06O08's eyes are fixed on C01O02. Focus on the tense space and the paper boxes wedged between the two figures. The tall shelves from the reference compress the composition on both sides. Flat early-morning pale blue-gray ambient light from the fluorescent lights from the reference drains warmth from the scene, reflecting on the clean aisle floor from the reference.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "S#19 action: '이른 아침, 아직은 한산한 마트 안... 어제 만났던 남자 직원을 찾는다'",
              "shot description: 수리영 blocks the path of the male employee who is holding paper boxes, maintaining eye contact"
            ],
            "visual_inferences": [
              "C06 is carrying out morning stocking duties, holding inventory boxes",
              "The interaction happens directly in the aisle space between the display structures",
              "Cool, flat fluorescent lighting typical of early morning commercial spaces"
            ],
            "creative_decisions": [
              "Medium wide two-shot framing to show the physical blockage and the boxes wedged between them",
              "Pale blue-gray color grading to emphasize the drained, tense, and cold atmosphere of the early morning standoff",
              "Anchoring shelves and floor from the reference to maintain exact background continuity"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "5662badf2830b921",
              "owned_hash": "b0062c44273bd902",
              "camera_direction_hash": "9198f41bcf8f4be0",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "fluorescent light",
                  "violating_phrase": "fluorescent lights from the reference",
                  "reason": "The phrase only references existing fluorescent lights from the reference as ambient illumination; it does not ask to create or modify them.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shelf",
                  "violating_phrase": "tall shelves from the reference",
                  "reason": "The shelves are used as an existing framing element from the reference, with no instruction to add or change them.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "Maintains background continuity (exact_background) with the established supermarket interior from S8_Shot5.",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "C06",
          "P05",
          "L11",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height inside the quiet supermarket aisle, the camera ends its parallel track in a MWS, eye-level, squared two-shot framed between tall shelves, holding 수리영 left-middle and 남자 직원 right-middle with the paper boxes wedged between them. The confrontation reads as a still blockage in the aisle: boxed goods form rigid vertical lines behind him while 수리영 cuts across his path without changing the established approach axis.",
            "lighting_mood": "Flat early-morning supermarket fluorescents wash the aisle in pale blue-gray, draining warmth from the everyday setting.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C06",
              "P05",
              "L11",
              "L12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "cb_sales_floor_day_quiet",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "cash register",
              "checkout counter",
              "display island",
              "drink case",
              "emergency exit door",
              "endcap display",
              "fluorescent light",
              "notice board",
              "refrigerated case",
              "service shelf",
              "shelf",
              "shopping basket",
              "sliding door",
              "staff door",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C06O08",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "cb_sales_floor_day_quiet",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "0ce6ec40bc35d8d5"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "마트 외부 CCTV 확인",
        "representative_moment": "A close-up of a weather-stained CCTV camera mounted under the supermarket eave.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up, low angle looking up, muted blue-gray coastal daylight.",
            "t2i_prompt": "Photorealistic cinematic still. Low angle looking up. Focus on a slightly dirty, round CCTV camera dome mounted under a damp, dull metal eave, occupying the upper-right of the frame, the lens housing angled downward. Behind it, [L12: a weather-stained concrete exterior corner wall cuts diagonally across the background, its surface textured with age and subtle vertical water stains]. Overcast coastal daylight casts a muted blue-gray tone over the concrete, while a small, cold highlight catches on the camera's dark dome.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 7 description: Outside at the supermarket corner, the tilt reaches its highest point and tightens into a CU, low angle, isolating the round CCTV under the eave near the upper-right of frame while the corner wall cuts diagonally behind it. No people are visible."
            ],
            "visual_inferences": [
              "fixed_element supermarket_exterior_wall: weather-stained concrete exterior wall, muted blue-gray tone, vertical water stains.",
              "Lens housing catching a cold highlight reflecting the overcast sky."
            ],
            "creative_decisions": [
              "Placed the metal eave at the very top edge to create a sense of downward pressure, fitting the low angle.",
              "Maintained a stark, empty composition to emphasize the CCTV as a silent, crucial clue."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "50182035f68a9286",
              "owned_hash": "59d4c51343060376",
              "camera_direction_hash": "10e0e3d0b31ad8b6",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "S8_Shot6 established the exterior location of the supermarket, sharing the same environmental lighting and concrete wall texture.",
        "_shot_index": 7,
        "visible_entities": [
          "P05",
          "L11",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside at the supermarket corner, the tilt reaches its highest point and tightens into a CU, low angle, isolating the round CCTV under the eave near the upper-right of frame while the corner wall cuts diagonally behind it. No people are visible; the lens housing sits like a mute eye against weather-stained concrete, held as the decisive clue before the camera can drop back toward 수리영.",
            "lighting_mood": "Overcast coastal daylight keeps the wall muted blue-gray, with the CCTV dome catching a small cold highlight like an accusing eye.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P05",
              "L11",
              "L12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_exterior_entrance_day_cctv_wall",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "supermarket_exterior_wall",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A weather-stained concrete exterior wall of a commercial building. The surface is textured with age, showing subtle streaks and wear typical of an older structure. It is illuminated by cold, overcast daylight, casting a muted blue-gray tone over the concrete.",
                "applies_to_shots": [
                  7,
                  8
                ],
                "source_facts": [
                  "Shot 7: 'weather-stained concrete', 'supermarket corner', 'Overcast coastal daylight keeps the wall muted blue-gray'",
                  "Shot 8: 'Beside the supermarket wall', 'The wall line slides shallowly behind her', 'wall-reflected gray light'"
                ],
                "visual_inferences": [
                  "The concrete has a slightly coarse finish with subtle vertical water stains indicating long-term exposure to coastal weather."
                ],
                "creative_decisions": [
                  "Maintaining a consistent bleak blue-gray color palette on the wall to anchor the spatial continuity between the CCTV reveal and the character's reaction shot."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C06O08",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "8324985efe2528ec"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "CCTV 확인 후 상황 보고",
        "representative_moment": "마트 외벽을 등진 C01O02가 휴대폰을 귀에 댄 채 긴장된 표정으로 허공을 응시하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight head-and-shoulder profile composition with a tilted angle, cold gray daylight and sickly green fluorescent accent.",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a navy windbreaker, a young East Asian woman, in right profile. Head-and-shoulder tilted composition, her tense side face occupying the right half of the frame. Her mouth is slightly open, a dark smartphone pressed tightly to her ear in the lower-right quadrant, eyes looking into the distance. Sharp focus on her tense expression. Cold daylight and wall-reflected gray light wash the side of her face, with a faint sickly green glow reflecting on her jawline and jacket edge. [L12: A weather-stained concrete exterior wall running diagonally close behind her shoulder, its textured damp surface muted in cold overcast daylight].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot 8: 휴대폰을 귀에 바짝 댄 채 입을 벌린 수리영의 긴장된 옆얼굴.",
              "DP instruction: tense side face occupying the right half while the phone presses against her ear in the lower-right quadrant",
              "Cold daylight and wall-reflected gray light... faint sickly green cast from the storefront fluorescents"
            ],
            "visual_inferences": [
              "fixed_element supermarket_exterior_wall: A weather-stained concrete exterior wall",
              "Dutch angle translated into a tilted composition with the background wall running diagonally",
              "Subject mapped to right profile based on DP instruction 'occupying the right half'"
            ],
            "creative_decisions": [
              "Used head-and-shoulder composition to comply with the close framing face phrasing rule, keeping the jacket edge visible to anchor the face",
              "Applied sickly green glow to jawline and jacket edge to convey tension without using forbidden lighting verbs that bisect features"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a74b8673c009d7f0",
              "owned_hash": "59d4c51343060376",
              "camera_direction_hash": "63c9f90195e4f103",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "previous_shot_refs에 명시된 8번 씬의 외벽(supermarket_exterior_wall) 질감과 색감 연속성 유지",
        "_shot_index": 8,
        "visible_entities": [
          "C01",
          "P05",
          "L11",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Beside the supermarket wall at 수리영's shoulder height, the lateral track resolves into a tight CU, Dutch angle, profile shot of her tense side face occupying the right half while the phone presses against her ear in the lower-right quadrant. The wall line slides shallowly behind her, but the only emphasized change from the CCTV reveal is camera distance, pulled close enough to hold her open mouth and strained breath.",
            "lighting_mood": "Cold daylight and wall-reflected gray light carve her profile sharply, with a faint sickly green cast from the storefront fluorescents leaking outside.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P05",
              "L11",
              "L12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_exterior_entrance_day_cctv_wall",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "supermarket_exterior_wall",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A weather-stained concrete exterior wall of a commercial building. The surface is textured with age, showing subtle streaks and wear typical of an older structure. It is illuminated by cold, overcast daylight, casting a muted blue-gray tone over the concrete.",
                "applies_to_shots": [
                  7,
                  8
                ],
                "source_facts": [
                  "Shot 7: 'weather-stained concrete', 'supermarket corner', 'Overcast coastal daylight keeps the wall muted blue-gray'",
                  "Shot 8: 'Beside the supermarket wall', 'The wall line slides shallowly behind her', 'wall-reflected gray light'"
                ],
                "visual_inferences": [
                  "The concrete has a slightly coarse finish with subtle vertical water stains indicating long-term exposure to coastal weather."
                ],
                "creative_decisions": [
                  "Maintaining a consistent bleak blue-gray color palette on the wall to anchor the spatial continuity between the CCTV reveal and the character's reaction shot."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C06O08",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "dab9f21ef60c031b"
      },
      {
        "scene_index": 20,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "형체를 알 수 없는 CCTV 화면 앞에서의 초조함",
        "representative_moment": "수리영이 혜수와 보안 직원의 등 뒤에 서서 두 손을 꽉 쥔 채 모니터의 푸른 불빛을 받으며 불안하게 화면을 주시하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level over-the-shoulder composition, close framing, cool high-contrast fluorescent and monitor glow",
            "t2i_prompt": "Photorealistic cinematic still. Shot from the front corner of the shared desk, looking across the heavily blurred shoulders of a young East Asian woman and a middle-aged East Asian man in the immediate foreground. C01O02 in a navy windbreaker, a young East Asian woman, occupies the center background, facing the camera with her upper body in frame. Her hands are tightly clasped near the lower center, her eyes fixed downward on the monitor. The edge of a computer monitor with a thin dark bezel and the desk corner form a boxed-in foreground frame, the screen facing away from the camera. A harsh, cold bluish glow from the monitor washes over C01O02's features and hands. Sickly fluorescent light catches the desk surface, while the immediate space behind her is [L13: submerged in heavy, blue-gray shadow, creating a murky and dim atmosphere]. Focus on the cold bluish light isolating the central figure behind the desk.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot 2: 수리영 in the back staring anxiously at the screen",
              "hands tightly clasped",
              "sickly fluorescent light pools on the desk",
              "monitor casts cold bluish light"
            ],
            "visual_inferences": [
              "The foreground figures (혜수 and the security employee) are rendered as heavily blurred backs as common nouns to comply with the face_identifiability_rule",
              "The monitor is positioned between 수리영 and the camera, with its edge visible and screen projecting light onto her"
            ],
            "creative_decisions": [
              "Applied 'skipped_close_framing' by omitting the broader room reference and replacing the background with a localized [L13: ...] shadow block",
              "Anchored the foreground and background figures using the 'shared desk' to ensure spatial consistency",
              "Avoided body-part trigger phrases in the 'Focus on' statement to prevent C##O## rejection"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "8b9d2dac5a14c25c",
              "owned_hash": "8a3bc4b2c5784cad",
              "camera_direction_hash": "703b5825d7e91a67",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the front corner of the desk at eye level, the camera steadies after its track into an MCU, eye-level, over-the-shoulder composition across the blurred backs of 혜수 and the security employee toward 수리영 centered in the background. Her anxious face sits above her tightly clasped hands near the lower center, with the monitor edge and desk corner forming a boxed-in foreground frame.",
            "lighting_mood": "Sickly fluorescent light pools on the desk while the room falls into blue-gray office shadow, making 수리영's hands and face feel trapped behind the monitor glow.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L13"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C14",
                "outlook_id": "O14"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_security_office_day_cctv_review",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cctv_monitor",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A computer monitor resting on a desk, featuring a thin dark bezel. The screen displays extremely dark, blackened digital footage heavily obscured by murky gray-green pixel noise, refresh lines, and compression artifacts. The screen continuously emits a cold, bluish glow.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "source_facts": [
                  "scene text: 그 부분만 유독 어두워 식별이 불가능하다.",
                  "Shot 2: the monitor edge and desk corner forming a boxed-in foreground frame... monitor glow",
                  "Shot 3: monitor at just above desk height... blackened footage surrounded by a thin bezel... distorted by pixel noise, refresh lines, and compression darkness... gray-green digital noise."
                ],
                "visual_inferences": [
                  "The monitor is a standard modern flat-screen display used in typical security setups.",
                  "The footage remains statically unidentifiable, showing no clear movement due to the heavy digital noise."
                ],
                "creative_decisions": [
                  "Emphasizing the gray-green noise and the physical thin bezel to strongly anchor the prop as the source of the mystery and frustration in the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dim_office_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The office interior is submerged in heavy, blue-gray shadows, creating a dim and murky atmosphere. The darkness is only broken by a sickly fluorescent light pooling directly on the desk surface and the harsh, cold bluish light cast outward from the computer monitor.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "source_facts": [
                  "Shot 2: Sickly fluorescent light pools on the desk while the room falls into blue-gray office shadow",
                  "Shot 3: The monitor casts cold bluish light into the surrounding dim office"
                ],
                "visual_inferences": [
                  "The ambient ceiling lights are mostly turned off or broken, resulting in localized pools of light rather than even illumination."
                ],
                "creative_decisions": [
                  "Using a stark contrast between the sickly fluorescent pooling and the cold blue monitor glow to heighten the sense of anxiety and claustrophobia."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C14O14",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5b5e6400d3ade7c0"
      },
      {
        "scene_index": 20,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "식별 불가능한 CCTV 영상",
        "representative_moment": "모니터 화면에 노이즈가 낀 어두운 인물 그림자가 띄워져 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up of the monitor screen, cold bluish digital glow with gray-green pixel noise",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the screen of a computer monitor occupying the center of the frame. The display shows extremely dark, blackened digital footage, where a vague black shadow of a human figure sits off-center like a stain, heavily obscured by murky gray-green pixel noise, horizontal refresh lines, and heavy compression artifacts. The screen is bordered by a thin dark bezel. [L13: The immediate lower frame edge reveals a desk surface submerged in heavy blue-gray shadow, with a partly visible keyboard and tangled dusty cables]. The monitor continuously emits a harsh, cold bluish glow outward, contrasting with a faint, sickly fluorescent light pooling on the desk surface just below the base.",
            "outfit_assignments": [],
            "source_facts": [
              "scene text: 그 부분만 유독 어두워 식별이 불가능하다.",
              "shot description: 검은 그림자만 어렴풋이 보이는 어두운 CCTV 영상이 띄워진 모니터 화면 클로즈업."
            ],
            "visual_inferences": [
              "fixed_element cctv_monitor: A computer monitor resting on a desk, featuring a thin dark bezel... heavily obscured by murky gray-green pixel noise.",
              "fixed_element dim_office_environment: sickly fluorescent light pooling directly on the desk surface and the harsh, cold bluish light cast outward from the computer monitor."
            ],
            "creative_decisions": [
              "Emphasized the murky gray-green pixel noise and compression artifacts to highlight the unidentifiable nature of the footage.",
              "Utilized close framing to fill the view with the screen while retaining the thin bezel and desk edge to maintain the physical anchor of the prop."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "0888562a96433324",
              "owned_hash": "0dc9315dd6506f73",
              "camera_direction_hash": "0cc77d90b6a252ea",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "Shot 2의 책상 환경과 모니터 조명 질감 일관성 유지 (zoom_in_detail 연속성 적용)",
        "_shot_index": 3,
        "visible_entities": [
          "L13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Directly in front of the monitor at just above desk height, the dolly-in ends in a CU, slight low angle, through-device frame of the CCTV playback, with the screen surface kept central and the blackened footage surrounded by a thin bezel and desk shadows. The vague black shadow in the recorded image sits off-center like a stain, distorted by pixel noise, refresh lines, and compression darkness rather than by the room itself.",
            "lighting_mood": "The monitor casts cold bluish light into the surrounding dim office, while the CCTV image collapses into murky blacks and gray-green digital noise.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L13"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C14",
                "outlook_id": "O14"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_security_office_day_dark_cctv_monitor",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cctv_monitor",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A computer monitor resting on a desk, featuring a thin dark bezel. The screen displays extremely dark, blackened digital footage heavily obscured by murky gray-green pixel noise, refresh lines, and compression artifacts. The screen continuously emits a cold, bluish glow.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "source_facts": [
                  "scene text: 그 부분만 유독 어두워 식별이 불가능하다.",
                  "Shot 2: the monitor edge and desk corner forming a boxed-in foreground frame... monitor glow",
                  "Shot 3: monitor at just above desk height... blackened footage surrounded by a thin bezel... distorted by pixel noise, refresh lines, and compression darkness... gray-green digital noise."
                ],
                "visual_inferences": [
                  "The monitor is a standard modern flat-screen display used in typical security setups.",
                  "The footage remains statically unidentifiable, showing no clear movement due to the heavy digital noise."
                ],
                "creative_decisions": [
                  "Emphasizing the gray-green noise and the physical thin bezel to strongly anchor the prop as the source of the mystery and frustration in the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dim_office_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The office interior is submerged in heavy, blue-gray shadows, creating a dim and murky atmosphere. The darkness is only broken by a sickly fluorescent light pooling directly on the desk surface and the harsh, cold bluish light cast outward from the computer monitor.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "source_facts": [
                  "Shot 2: Sickly fluorescent light pools on the desk while the room falls into blue-gray office shadow",
                  "Shot 3: The monitor casts cold bluish light into the surrounding dim office"
                ],
                "visual_inferences": [
                  "The ambient ceiling lights are mostly turned off or broken, resulting in localized pools of light rather than even illumination."
                ],
                "creative_decisions": [
                  "Using a stark contrast between the sickly fluorescent pooling and the cold blue monitor glow to heighten the sense of anxiety and claustrophobia."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C14O14",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "a6f86a6bac15826d"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "끔찍한 증거물 확인",
        "representative_moment": "P11 수사 사진 속 적나라하게 훼손된 시신의 상처 부위가 프레임 가득 클로즈업되어 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up insert, high angle from above, shallow depth of field, cold fluorescent lighting",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up insert shot from a high angle looking directly down at a glossy crime-scene photograph, P11. Focus on the printed image centered in the frame, depicting a horrific jagged gash of dark red torn flesh. The primary photograph is framed by chaotic, overlapping edges of neighboring printed evidence spreading outward. The tight composition reveals only a narrow border of [L15: a scratched office laminate desk surface] and a single, out-of-focus silver paper clip at the very edge. Harsh fluorescent lighting reflects on the glossy paper, washing the surrounding elements in cold blue-gray tones, allowing the deep crimson of the printed wound to stand out with intense saturation.",
            "outfit_assignments": [],
            "source_facts": [
              "혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다.",
              "목, 어깨, 얼굴등 살점이 떨어져 보는 것만으로도 끔찍하다.",
              "shot description: CU, high angle, shallow-DOF insert of a printed crime-scene photograph, torn wound area near center"
            ],
            "visual_inferences": [
              "fixed_element scattered_crime_photos: chaotic pile, glossy finish",
              "fixed_element cold_police_office_environment: dull institutional surface, cold blue-gray tone",
              "silver paper clip at the frame edge acting as a small scale reference"
            ],
            "creative_decisions": [
              "Used close framing rules to completely omit the background room, focusing exclusively on the desk surface and the overlapping evidence photos to create an invasive feeling.",
              "Contrasted the cold blue-gray fluorescent reflections on the glossy paper with the deep crimson of the wound to make the horrific detail pop."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "31614820ef21a7b5",
              "owned_hash": "aa34738df1198728",
              "camera_direction_hash": "516d6445544dd91d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "경찰서 책상 위의 환경 톤(cold_police_office_environment) 및 훼손된 시신 사진(scattered_crime_photos)의 조명과 질감 연속성 유지",
        "_shot_index": 6,
        "visible_entities": [
          "P11",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At tabletop height beside 혜수's desk, the camera continues its forward pressure into a CU, high angle, shallow-DOF insert of a printed crime-scene photograph, with the torn wound area held near center and the desk reduced to narrow edges around it. The photograph is not hallucinated but feels invasive: neighboring prints overlap at the margins, making the evidence pile look like something spreading across the desk surface.",
            "lighting_mood": "Harsh police-office fluorescents flatten the glossy photo in cold blue-gray, with the wound’s dark red tones cutting through as the only saturated color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P11",
              "L15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_office_day_evidence_photos_gps_popup",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "scattered_crime_photos",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A chaotic pile of glossy, printed crime-scene photographs scattered and overlapping across a flat office desk. The visible images prominently feature horrific, dark red wounds of torn flesh, serving as a gruesome focal point in the workspace.",
                "applies_to_shots": [
                  6,
                  7
                ],
                "source_facts": [
                  "혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다.",
                  "목, 어깨, 얼굴등 살점이 떨어져 보는 것만으로도 끔찍하다."
                ],
                "visual_inferences": [
                  "The photos have a glossy finish that catches the ambient office light.",
                  "They are piled haphazardly, indicating a busy and ongoing investigation."
                ],
                "creative_decisions": [
                  "Positioning the overlapping photographs prominently on the desk to visually connect the insert shot with the character's reaction shot."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_police_office_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A sterile police office workspace anchored by a standard, flat bureaucratic desk surface. The surrounding environment is characterized by a cold, desaturated blue-gray tone and institutional stillness, providing a grim backdrop for the evidence and equipment on the desk.",
                "applies_to_shots": [
                  6,
                  7,
                  8
                ],
                "source_facts": [
                  "S#21. 경찰서 안 / D",
                  "사무실에 홀로 앉아있는 수리영"
                ],
                "visual_inferences": [
                  "The desk features a dull, standard institutional surface.",
                  "The overall lighting remains cold and harsh, emphasizing a bleak atmosphere."
                ],
                "creative_decisions": [
                  "Using the edge of the desk and the cold ambient tone as a framing and atmospheric anchor across the close-up shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "e8830f856ec7536c"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "사진을 확인한 수리영의 경악",
        "representative_moment": "책상 위 훼손된 시신 사진을 본 수리영(C01)이 자신이 본 환각과 일치함에 경악하며 눈이 커지는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Dutch angle, seated eye-level composition with upward tilt focusing on the character's shocked expression",
            "t2i_prompt": "Photorealistic cinematic still. A diagonally tilted frame from a seated perspective with a slight upward tilt. C01O02 in a navy windbreaker, a young Asian woman, leans forward from behind a horizontal desk edge, her head and upper chest occupying the center. She is at three-quarter angle from the left, her widened eyes positioned in the upper third of the frame, fixed downward on the blurred, glossy crime-scene photographs scattered and overlapping in the immediate lower foreground. The camera focuses on the horrifying realization gripping her features. Cold fluorescent overhead light reflects on the wetness in her eyes, emphasizing her psychological shock. The space behind her is sealed off by [L15: a sterile, heavily out-of-focus institutional wall in desaturated blue-gray tones], creating a grim and claustrophobic stillness.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "사무실에 홀로 앉아있는 수리영, 혜수 책상위에는 살인사건(1부 1,2,3씬) 확대 사진들이 어지럽게 널려있다.",
              "넘겨보며 놀라는 수리영, 환각상태에서 본 엄마의 시신모습과 너무도 흡사한 - 목, 어깨, 얼굴등 살점이 떨어져 보는 것만으로도 끔찍하다."
            ],
            "visual_inferences": [
              "fixed_element scattered_crime_photos: blurred foreground element to frame her reaction",
              "Cold fluorescent lighting catching the emotional tension in her eyes",
              "Close framing emphasizing the character's facial reaction while minimizing background distraction"
            ],
            "creative_decisions": [
              "Described the Dutch angle as 'A diagonally tilted frame' to avoid shot type keywords.",
              "Placed the blurred crime photos in the lower foreground to act as a visual anchor and trigger for her expression.",
              "Used skipped_close_framing rule by omitting the background reference and constructing a soft, claustrophobic blue-gray wall edge directly via the L15 block."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "44cbf7758bbedf1c",
              "owned_hash": "aa34738df1198728",
              "camera_direction_hash": "26b6b6d9dade6188",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "같은 공간 안의 반응 샷이므로 연속성은 유지되나, close framing 렌더링 전략에 따라 기존 배경 레퍼런스를 배제하고 피사체의 감정적 주변부만 묘사함.",
        "_shot_index": 7,
        "visible_entities": [
          "C01",
          "P11",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just across the desk from 수리영 at seated eye level, the upward tilt stops in a CU, Dutch angle, front-side composition with her widened eyes in the upper third and the blurred photographs low in the foreground. She leans into the frame from behind the desk edge, recognizing the echo of her vision while the office behind her falls soft and empty.",
            "lighting_mood": "Cold fluorescent light catches the wetness in her eyes while the background remains desaturated blue-gray, pushing the shock into a claustrophobic police-office stillness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P11",
              "L15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_office_day_evidence_photos_gps_popup",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "scattered_crime_photos",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A chaotic pile of glossy, printed crime-scene photographs scattered and overlapping across a flat office desk. The visible images prominently feature horrific, dark red wounds of torn flesh, serving as a gruesome focal point in the workspace.",
                "applies_to_shots": [
                  6,
                  7
                ],
                "source_facts": [
                  "혜수 책상위에는 살인사건 확대 사진들이 어지럽게 널려있다.",
                  "목, 어깨, 얼굴등 살점이 떨어져 보는 것만으로도 끔찍하다."
                ],
                "visual_inferences": [
                  "The photos have a glossy finish that catches the ambient office light.",
                  "They are piled haphazardly, indicating a busy and ongoing investigation."
                ],
                "creative_decisions": [
                  "Positioning the overlapping photographs prominently on the desk to visually connect the insert shot with the character's reaction shot."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cold_police_office_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A sterile police office workspace anchored by a standard, flat bureaucratic desk surface. The surrounding environment is characterized by a cold, desaturated blue-gray tone and institutional stillness, providing a grim backdrop for the evidence and equipment on the desk.",
                "applies_to_shots": [
                  6,
                  7,
                  8
                ],
                "source_facts": [
                  "S#21. 경찰서 안 / D",
                  "사무실에 홀로 앉아있는 수리영"
                ],
                "visual_inferences": [
                  "The desk features a dull, standard institutional surface.",
                  "The overall lighting remains cold and harsh, emphasizing a bleak atmosphere."
                ],
                "creative_decisions": [
                  "Using the edge of the desk and the cold ambient tone as a framing and atmospheric anchor across the close-up shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "bdef60a5660bdfe3"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "해상 좌표 확인",
        "representative_moment": "모니터 화면 클로즈업. 차가운 지도 화면 위에 붉은색 GPS 좌표가 선명하게 떠 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Squared close-up on the monitor screen, eye-level, cold cyan digital lighting with stark crimson accents",
            "t2i_prompt": "Photorealistic cinematic still. Close-up on a glowing computer monitor display. Focus on sharp crimson GPS coordinate text positioned slightly below the center over a digital sea map. The screen emits a cold cyan light, featuring subtle digital pixel texture and a faint glossy sheen on the glass. The monitor's dark bezel tightly borders the illuminated interface. [L15: A thin sliver of a flat bureaucratic desk surface is visible at the very bottom edge of the frame, resting in dim, muted shadow.] The stark red text creates a vivid visual contrast against the bleak, cold blue-gray digital illumination dominating the tight composition.",
            "outfit_assignments": [],
            "source_facts": [
              "S#21 action: '모니터에서 뭔가 뜬다... 해상 지도위에 좌표...'",
              "shot description: computer monitor on, showing sea map and red GPS coordinates"
            ],
            "visual_inferences": [
              "fixed_element cold_police_office_environment tone is preserved through the cold cyan map light and muted shadows",
              "The bezel and a sliver of the desk are visible just to provide scale for the screen"
            ],
            "creative_decisions": [
              "Used [L15: ...] block to describe the frame-edge desk surface as required by skipped_close_framing rule",
              "Omitted specific numerical coordinate text to avoid T2I garbling, using 'crimson GPS coordinate text' instead",
              "Emphasized the digital pixel texture and glass sheen to fulfill the through_device perception mode subtly"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "115a9b3dd2d1d022",
              "owned_hash": "aa34738df1198728",
              "camera_direction_hash": "98dc3757e06b7a77",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "같은 공간(경찰서 사무실) 안에서의 시각적 연속성 (동일한 책상 질감 및 차가운 조명 톤 유지)",
        "_shot_index": 8,
        "visible_entities": [
          "P11",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At monitor height on the side of the desk, the camera completes its track into a squared CU, eye-level, through-device composition where the display sits cleanly in the center with its bezel and a sliver of desk still visible for scale. The sea map and red GPS coordinate text are readable, the crimson numbers positioned slightly below center like a wound opening in an otherwise bureaucratic interface.",
            "lighting_mood": "The monitor’s cold cyan map light dominates the frame, punctured by sharp crimson coordinate text against the muted police-office darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P11",
              "L15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_office_day_evidence_photos_gps_popup",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_police_office_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A sterile police office workspace anchored by a standard, flat bureaucratic desk surface. The surrounding environment is characterized by a cold, desaturated blue-gray tone and institutional stillness, providing a grim backdrop for the evidence and equipment on the desk.",
                "applies_to_shots": [
                  6,
                  7,
                  8
                ],
                "source_facts": [
                  "S#21. 경찰서 안 / D",
                  "사무실에 홀로 앉아있는 수리영"
                ],
                "visual_inferences": [
                  "The desk features a dull, standard institutional surface.",
                  "The overall lighting remains cold and harsh, emphasizing a bleak atmosphere."
                ],
                "creative_decisions": [
                  "Using the edge of the desk and the cold ambient tone as a framing and atmospheric anchor across the close-up shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "d6d152fa203a8030"
      },
      {
        "scene_index": 22,
        "heading": "S#22. 경찰서 밖 / D",
        "beat_title": "다급한 출발",
        "representative_moment": "자전거에 올라타 다급히 도로를 향해 상체를 숙이고 핸들을 꽉 쥔 수리영(C01).",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height medium tracking shot, low angle, left profile action frame, cold blue coastal daylight",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a navy windbreaker, a young East Asian woman, in left profile, leaning heavily forward in mid-pedal over the bicycle from the reference. Her hair and jacket flap stream backward in the direction opposite to motion. Eyes fixed on the open road from the reference stretching ahead on the left. Her clenched hands occupy the lower foreground, gripping the handlebars. The bicycle frame and front wheel from the reference are visible below her as her bent upper torso drives diagonally forward. Framed from a low angle at chest height, the muted gray station building from the reference recedes in the background. Cold daylight with a blue coastal cast washes over her and the damp concrete curb from the reference running parallel at the bottom edge. Focus on her urgent forward-leaning posture and the tension in her shoulders.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#22 action: '주차된 자전거를 타고 이내 달리는 수리영'",
              "shot description: 수리영 gripping bicycle handlebars tightly, leaning forward in urgent side profile toward the road"
            ],
            "visual_inferences": [
              "mid-pedal action freeze with hair and jacket flowing backward to convey urgent forward motion",
              "left profile tracking composition placing the destination road on the left",
              "cold blue coastal daylight reflecting on the damp concrete"
            ],
            "creative_decisions": [
              "low angle at chest height to emphasize her bent shoulders and driving momentum",
              "explicitly anchored owned objects (bicycle, road, curb, station building) from the exact_background reference to prevent dual generation"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d0bbb9f96d512bcb",
              "owned_hash": "4d2f9e2d47e6da8f",
              "camera_direction_hash": "92c780fae517292b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bicycle",
                  "violating_phrase": "the bicycle from the reference",
                  "reason": "The phrase explicitly references the existing bicycle from the reference, which anchors the object rather than instructing it to be newly created or modified.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "road",
                  "violating_phrase": "the open road from the reference",
                  "reason": "The road is mentioned as an existing referenced element and is used as a spatial anchor, not as a newly drawn object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "station building",
                  "violating_phrase": "the muted gray station building from the reference",
                  "reason": "The station building is described as already present in the reference, so this is an anchor reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curb",
                  "violating_phrase": "the damp concrete curb from the reference",
                  "reason": "The curb is referenced as an existing background element and only described by state, which counts as anchor_reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency specified.",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L16"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 22,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Parallel to the bicycle on 수리영's side at chest height, the camera tracks with her in an MS, low angle, side-profile action frame, tightening toward the handlebar line and upper torso while the road opens ahead on the left. Her clenched hands occupy the lower foreground without overwhelming the frame, and her bent shoulders drive diagonally forward as she pushes off from the curb into traffic space.",
            "lighting_mood": "Cold daylight over the police-station curb gives the scene a blue coastal cast, with hard gray asphalt and damp concrete sharpening the urgency.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L16"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_station_entrance_day_bicycle_departure",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV pole",
              "bicycle",
              "bicycle rack",
              "bollard",
              "canopy",
              "car",
              "crosswalk",
              "curb",
              "parking lot",
              "parking marking",
              "plaza",
              "road",
              "road arrow",
              "service door",
              "sign panel",
              "sliding door",
              "station building",
              "tactile paving",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_station_entrance_day_bicycle_departure",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "457b47441f3f08b1"
      },
      {
        "scene_index": 23,
        "heading": "S#23. 어느 PC방 / 실내",
        "beat_title": "지도 좌표 확인",
        "representative_moment": "수리영(C01)이 어두운 PC방 안에서 파란 모니터 불빛을 받으며 지도 화면을 집중해서 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium close-up, through-object framing past a monitor bezel, cold blue monitor spill against dark shadow",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level medium close-up. A dark monitor bezel sits as an out-of-focus sliver in the right foreground. C01O02 in a navy windbreaker, a young East Asian woman, occupies the left-center frame at a three-quarter angle from the right. She is hunched forward, eyes fixed on the glowing screen. Cold blue monitor light washes the side of her face and illuminates her concentrated expression, catching on her cheek and jawline. Behind her, the PC room is sunk in muted gray-black shadow, with a faint, sickly fluorescent residue barely visible in the dark, indistinct background depth.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#23 어느 PC방 / 실내",
              "수리영, 좌표를 찍고 위치를 확인",
              "Shot description: 디지털 지도가 띄워진 모니터 불빛에 비친 수리영의 집중한 얼굴."
            ],
            "visual_inferences": [
              "Monitor bezel placed in the foreground to create a through-object framing effect",
              "PC room aisle is dark and indistinct, focusing attention purely on the lit face",
              "Lighting translated from DP's 'carves her face' to 'washes the side of her face' to safely comply with T2I body integrity rules"
            ],
            "creative_decisions": [
              "Medium close-up framing with the monitor bezel on the right and her face on the left creates an intimate, observational perspective.",
              "Cold blue light contrasting with gray-black shadow emphasizes the tense, focused mood of tracking the coordinates."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "0972189f60a955a4",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "46c8495429a88c12",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "P09",
          "P12",
          "L17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 23,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the flow's front-left monitor edge, use a medium close-up (MCU), eye-level, through-object framing: the monitor bezel sits as a dark sliver in the right foreground while 수리영's map-lit face holds left-center within arm's length. The camera is an observer, not her POV, settling at the end of a quiet dolly-in and holding just long enough for her concentration to read against the indistinct rows of the PC room.",
            "lighting_mood": "Cold blue monitor light carves her face while the PC방 remains sunk in muted gray-black shadow with sickly fluorescent residue overhead.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P09",
              "P12",
              "L17"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "eb107dfa8557e28f"
      },
      {
        "scene_index": 24,
        "heading": "해안가 / 소나기",
        "beat_title": "폭우를 뚫고 달리는 맹렬한 추적",
        "representative_moment": "C01이 쏟아지는 비를 맞으며 해안 도로에서 자전거를 타고 질주하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium shot, eye-level front-left tracking position, shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. Medium shot at eye-level from a front-left tracking position just ahead of the subject, shallow depth of field. C01O02 in a soaked navy windbreaker, a young East Asian woman, at a three-quarter angle from the left, leaning forward over the handlebars of a bicycle in mid-pedal. Her wet hair and jacket flap stream backward in the direction opposite to motion. Both clenched hands grip the wet handlebar tightly in the lower third of the frame, the bicycle's front frame and the top of the front wheel visible below her. Her eyes are fixed intensely on the wet asphalt ahead. Focus on her determined face and tense upper body against the storm. Storm-dark blue and slate gray ambient light washes through the heavy, wind-driven rain, while brief cold highlights reflect on her wet skin, soaked clothes, and the metal handlebar. In the blurred background, a rain-slick coastal road and a wet lateral guardrail streak by.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#24 action: '자전거를 타고 빗속을 달리는 수리영. 오로지 엄마를 찾아야한다는 생각 뿐.'",
              "shot description: 수리영's wet upper body, clenched hands on handlebar, rain-slick coastal road, heavy rain."
            ],
            "visual_inferences": [
              "bicycle front frame and wheel visible to anchor the character's seated posture and satisfy large prop rule",
              "mid-pedal pose with hair streaming backward to preserve forward motion direction in a freeze frame"
            ],
            "creative_decisions": [
              "storm-dark blue and slate gray ambient light with cold highlights to emphasize the harsh, desperate mood",
              "blurred guardrail in the background to create a strong sense of tracking speed"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "77da2655f4834fea",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "831b1c1357d6a81b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 9,
        "dependency_reason": "해안가 도로의 지형적 배경 연속성 유지 (날씨는 폭우로 변경된 상태)",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Maintain the flow's front-left tracking position with a medium shot (MS), eye-level, shallow DOF frame held unusually steady inside the motion: 수리영's wet upper body occupies center-left, both clenched hands visible near the lower third on the handlebar. The camera runs just ahead of the bicycle, compressing rain, wind-whipped hair, and forward lean into a single forceful instant while the slick coastal road streaks behind her.",
            "lighting_mood": "Storm-dark blues and slate grays are cut by brief cold highlights on rainwater, making her skin and soaked clothes look harsh and desperate.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "L08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 9,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "8e3add8d9656925b"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "침입의 흔적",
        "representative_moment": "거실 장판 바닥 곳곳에 찍힌 진흙 묻은 낯선 발자국들을 클로즈업으로 비춘다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up (ECU), worm's eye angle at floor level, fading cold gray dusk light with a faint greenish cast, shallow depth of field isolating the footprints.",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up, worm's eye angle at floor level. Focus on fresh, wet, dark muddy footprints running diagonally from the lower left across [L07: a scuffed, pale beige vinyl floor]. Fading dusk light leaks across the surface in cold gray bands, turning the mud nearly black against the sickly vinyl. Heavy dull shadows and a faint greenish ambient cast fill the immediate surroundings. In the distant, blurred background, overturned dining chairs and a small open window frame are entirely out of focus, serving as soft scale references. The atmosphere is gloomy and highly suspenseful.",
            "outfit_assignments": [],
            "source_facts": [
              "S#25 action: '누군가 다녀간 흔적으로 보이는 발자국들. 거실에 난 창은 열려있고, 식탁 의자들을 쓰러져있다.'",
              "shot description: '거실 장판 바닥 곳곳에 선명하게 찍힌 진흙 묻은 낯선 발자국들의 클로즈업.'",
              "DP instruction POV: observer looking inward across the 장판."
            ],
            "visual_inferences": [
              "fixed_element cold_dusk_lighting: Fading dusk light in cold gray bands with heavy dull shadows and a faint greenish cast.",
              "fixed_element ransacked_living_room: Pale beige vinyl floor stamped with dark mud, overturned furniture and open window in the background.",
              "The observer (Suri-young) is out of frame, focusing entirely on the floor from an extreme low angle."
            ],
            "creative_decisions": [
              "Used an extreme close-up (ECU) with a worm's eye angle to make the footprints the primary focal point.",
              "Applied shallow depth of field to keep the overturned chairs and open window blurred, strictly adhering to the close framing rules and keeping focus on the immediate floor surface.",
              "Utilized cold, muted lighting to enhance the eerie, suspenseful mood of the break-in discovery."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "de03cd6ed3a9e5dc",
              "owned_hash": "80f679b464a34fb0",
              "camera_direction_hash": "f4dafde5c706768e",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "같은 옥탑방 내부 공간의 연속성 및 이전 씬의 발자국 등 환경 상태 일관성 유지",
        "_shot_index": 2,
        "visible_entities": [
          "P08",
          "P09",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Drop below the flow default into an extreme close-up (ECU), worm's eye angle, almost at floor level from the entrance threshold, looking inward across the 장판. Muddy unfamiliar footprints run diagonally from the lower left toward the dim living room, sharp in the foreground while overturned furniture and the open window remain small, blurred scale references in the distance.",
            "lighting_mood": "Fading dusk light leaks across the floor in cold gray bands, turning the mud nearly black against the sickly beige vinyl.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P08",
              "P09",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_dusk_ransacked_windy",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior space is illuminated by fading, cold gray dusk light, mixed with heavy dull shadows and a faint greenish cast, creating a gloomy and suspenseful atmosphere.",
                "applies_to_shots": [
                  2,
                  5,
                  9
                ],
                "source_facts": [
                  "Shot 2: Fading dusk light leaks across the floor in cold gray bands",
                  "Shot 5: Dim sunset gray mixes with a faint interior green cast",
                  "Shot 9: Cold dusk light from the open window and dull interior shadow"
                ],
                "visual_inferences": [
                  "The time of day creates a consistent cold, low-light environment across both the living room and the inner bedroom."
                ],
                "creative_decisions": [
                  "Unified the overall color palette with cold grays and faint greens to emphasize the eerie occult theme of the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ransacked_living_room",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A chaotic living room area featuring a pale beige vinyl floor stamped with dark, muddy footprints. In the background, pieces of furniture are overturned and scattered, and a window is left wide open, letting in the outside air.",
                "applies_to_shots": [
                  2,
                  9
                ],
                "source_facts": [
                  "Shot 2: Muddy unfamiliar footprints... sickly beige vinyl... overturned furniture and the open window remain small",
                  "Shot 9: Cold dusk light from the open window... dollies out along the entrance path"
                ],
                "visual_inferences": [
                  "The muddy footprints and overturned furniture established in Shot 2 remain in the background and on the floor of Shot 9 as the character walks through the same living room entrance path."
                ],
                "creative_decisions": [
                  "Kept the open window and muddy footprints visually present in the living room framing to ensure visual continuity of the recent break-in across both angles."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 20,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "6c4288d3e13a4f1b"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "벽에 그려진 붉은 원과 피묻은 사진",
        "representative_moment": "방 벽지 한가운데 그려진 거대한 붉은 원형 표식과 그 정중앙에 꽂힌 피묻은 낡은 사진.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium eye-level straight-on graphic composition with cold dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. Medium eye-level graphic composition from just inside the room. The back wall from the reference dominates the view, centered exactly on the crimson circle from the reference and the blood-stained photo from the reference pinned in its middle. The shadowed edge of the open door from the reference and the rumpled edge of the bed from the reference sit at the frame margins, grounding the cramped realistic space. Focus on the photo from the reference and the uneven red paint. Dim sunset gray light mixed with heavy dull shadows and a faint interior green cast washes the space, making the red mark the only aggressive color in the cold dusk lighting.",
            "outfit_assignments": [],
            "source_facts": [
              "S#25 action: '열린 자신의 방을 힐끗 보는데 벽에 또 붉은 원이 그려져있다. 그 가운데 꽂혀있는 피묻은 사진 한 장!'",
              "Shot description: 벽지 한가운데 붉은색으로 칠해진 커다란 원형 표식과 그 정중앙에 꽂힌 사진 한 장."
            ],
            "visual_inferences": [
              "fixed_element cold_dusk_lighting: fading, cold gray dusk light with heavy dull shadows and a faint greenish cast",
              "The character is removed from the frame to focus entirely on the occult target symbol on the wall"
            ],
            "creative_decisions": [
              "Used a straight-on push composition placing the door and bed edges at the margins to frame the red circle graphically while keeping the room's cramped reality",
              "Explicitly anchored owned objects (wall, circle, photo, door, bed) with 'from the reference' to comply with background_ref_attached policy"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "3fe04d5b136ea84e",
              "owned_hash": "36aeda8df398abde",
              "camera_direction_hash": "d6ec4c2026a8b3b1",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "wall",
                  "violating_phrase": "The back wall from the reference",
                  "reason": "The wall is explicitly referenced as existing in the reference, so this is an anchor reference rather than a redraw request.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "circle",
                  "violating_phrase": "the crimson circle from the reference",
                  "reason": "The circle is tied to the reference and described as a centered visual anchor, not as something newly created.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "photo",
                  "violating_phrase": "the blood-stained photo from the reference",
                  "reason": "The photo is explicitly from the reference, so it is being referenced, not newly generated.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "the shadowed edge of the open door from the reference",
                  "reason": "The door is presented as an existing reference object used for framing, not as a redraw target.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bed",
                  "violating_phrase": "the rumpled edge of the bed from the reference",
                  "reason": "The bed is only used as an existing frame-margin element from the reference, so this is anchor usage.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 25,
        "dependency_reason": "같은 옥탑방 안에서 카메라가 거실에서 방 내부 벽면으로 향하는 시점의 연속성 유지 (exact_background)",
        "_shot_index": 5,
        "visible_entities": [
          "P08",
          "P09",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From just inside 수리영's room, keep the flow's straight-on push and resolve into a wide shot (WS), eye-level, graphic reveal of the marked wallpaper. The red circle sits centered on the back wall with the blood-stained photograph pinned at its exact middle, while the bed edge and open doorway stay at the frame margins so the symbol reads like an occult target without losing the cramped room's realism.",
            "lighting_mood": "Dim sunset gray mixes with a faint interior green cast, making the crimson circle the only aggressive color in the room.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P08",
              "P09",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "bg_daughter_bedroom_dusk_red_circle_bloody_photo",
            "reference_usage": "exact_background",
            "owned_objects": [
              "backpack",
              "bed",
              "blanket",
              "ceiling light",
              "circle",
              "curtain",
              "doll",
              "door",
              "floor",
              "photo",
              "wall",
              "wallpaper",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior space is illuminated by fading, cold gray dusk light, mixed with heavy dull shadows and a faint greenish cast, creating a gloomy and suspenseful atmosphere.",
                "applies_to_shots": [
                  2,
                  5,
                  9
                ],
                "source_facts": [
                  "Shot 2: Fading dusk light leaks across the floor in cold gray bands",
                  "Shot 5: Dim sunset gray mixes with a faint interior green cast",
                  "Shot 9: Cold dusk light from the open window and dull interior shadow"
                ],
                "visual_inferences": [
                  "The time of day creates a consistent cold, low-light environment across both the living room and the inner bedroom."
                ],
                "creative_decisions": [
                  "Unified the overall color palette with cold grays and faint greens to emphasize the eerie occult theme of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 25,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "bg_daughter_bedroom_dusk_red_circle_bloody_photo",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "20546db5d6786df3"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "혼란 속의 결단과 탈출",
        "representative_moment": "백팩을 메고 피묻은 사진을 쥔 채 굳은 표정으로 밖을 향해 걷는 수리영.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium close-up (MCU) from chest height, low angle, front-facing dolly-out flow with soft background depth and cold dusk color temperature.",
            "t2i_prompt": "Photorealistic cinematic still. Medium close-up, low angle from chest height, head and torso occupying the frame while the lower body is beyond the bottom edge. C01O02 in a navy windbreaker, a young East Asian woman, facing the camera in mid-stride, advancing forward with a frontal stare, eyes fixed toward the camera. The dark straps of P09, a backpack, are pulled taut across both shoulders. One hand tightly grips P08, a photograph, positioned near the lower right of her torso, its edges and dark red stains partly visible to the camera. Fading cold gray dusk light washes over her face, casting heavy dull shadows and a faint greenish ambient hue across her jacket. [L07: soft out-of-focus background of a dim entrance path, with faint shapes of overturned chairs and a pale beige vinyl floor fading into the gloomy interior]. Focus on her intense expression and the dark backpack straps framing her torso.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot 9: Cold dusk light from the open window and dull interior shadow",
              "S25 action: 수리영, 마치 이끌리듯 백팩을 메고 밖으로 나간다. 사진을 손에 꼭 쥔 채.",
              "shot description: Hold the flow's frontal retreat as a medium close-up (MCU), low angle from chest height, with 수리영 advancing into the center",
              "shot description: backpack straps cut dark lines over both shoulders, and the clenched photograph stays visible near the lower right of her torso"
            ],
            "visual_inferences": [
              "fixed_element cold_dusk_lighting: fading cold gray dusk light with heavy dull shadows and a faint greenish cast",
              "fixed_element ransacked_living_room: overturned furniture and beige vinyl floor remain visible as soft background elements",
              "mid-stride stance conveys her steady forward advance toward the camera"
            ],
            "creative_decisions": [
              "Rendered the background as soft and out-of-focus (using L07 frame-edge description) to comply with the skipped_close_framing rule and emphasize the character's psychological state.",
              "Placed the photograph near the lower right torso to fit the chest-height low angle geometry without cluttering her face, matching the DP instructions."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "f1cf2eb8ff1b34ec",
              "owned_hash": "80f679b464a34fb0",
              "camera_direction_hash": "94232b33af724f11",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 25,
        "dependency_reason": "Same continuous space and lighting from S25_Shot5, but focusing tightly on the character's exit while maintaining the cold dusk environment established previously.",
        "_shot_index": 9,
        "visible_entities": [
          "C01",
          "P08",
          "P09",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Hold the flow's frontal retreat as a medium close-up (MCU), low angle from chest height, with 수리영 advancing into the center while the camera dollies out along the entrance path. Her backpack straps cut dark lines over both shoulders, and the clenched photograph stays visible near the lower right of her torso, making the frontal stare feel like a decision rather than a neutral portrait.",
            "lighting_mood": "Cold dusk light from the open window and dull interior shadow flatten the room, while the photo's dark red stains echo the occult mark she has just left behind.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P08",
              "P09",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_dusk_ransacked_windy",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cold_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior space is illuminated by fading, cold gray dusk light, mixed with heavy dull shadows and a faint greenish cast, creating a gloomy and suspenseful atmosphere.",
                "applies_to_shots": [
                  2,
                  5,
                  9
                ],
                "source_facts": [
                  "Shot 2: Fading dusk light leaks across the floor in cold gray bands",
                  "Shot 5: Dim sunset gray mixes with a faint interior green cast",
                  "Shot 9: Cold dusk light from the open window and dull interior shadow"
                ],
                "visual_inferences": [
                  "The time of day creates a consistent cold, low-light environment across both the living room and the inner bedroom."
                ],
                "creative_decisions": [
                  "Unified the overall color palette with cold grays and faint greens to emphasize the eerie occult theme of the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ransacked_living_room",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A chaotic living room area featuring a pale beige vinyl floor stamped with dark, muddy footprints. In the background, pieces of furniture are overturned and scattered, and a window is left wide open, letting in the outside air.",
                "applies_to_shots": [
                  2,
                  9
                ],
                "source_facts": [
                  "Shot 2: Muddy unfamiliar footprints... sickly beige vinyl... overturned furniture and the open window remain small",
                  "Shot 9: Cold dusk light from the open window... dollies out along the entrance path"
                ],
                "visual_inferences": [
                  "The muddy footprints and overturned furniture established in Shot 2 remain in the background and on the floor of Shot 9 as the character walks through the same living room entrance path."
                ],
                "creative_decisions": [
                  "Kept the open window and muddy footprints visually present in the living room framing to ensure visual continuity of the recent break-in across both angles."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 25,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5eef56dd826fa350"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "안개 속에서 다가오는 어선",
        "representative_moment": "짙은 안개벽을 뚫고 선착장 앞 수면을 가르며 다가오는 낡은 어선의 뱃머리.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle wide-medium shot from the pier edge, muted cold blue-gray haze",
            "t2i_prompt": "Photorealistic cinematic still. Low angle from the edge of [L18: a foggy coastal pier, slick wet wooden dock boards], the boards occupying the lower foreground and receding toward the dark harbor water. Center-frame, the bow of [L19: an old small fishing boat] is frozen mid-motion, water trailing off the hull, ripples expanding outward. The boat appears as a half-revealed dark silhouette emerging from a thick, pervasive gray fog bank. The dense fog blankets the sea, severely limiting background visibility. Muted, cold blue-gray ambient lighting desaturates the environment, leaving the vessel mostly swallowed by the pale haze. Faint highlights catch on the wet wood, preserving its volume and depth against the gloomy backdrop. Focus on the sharp bow piercing the fog wall.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot description: 안개벽 너머로 뱃머리를 반쯤 드러낸 채 수면을 가르고 있는 낡은 작은 어선의 검은 실루엣",
              "DP instruction: Low angle from pier edge, boat bow center-frame as a half-revealed black silhouette, wet dock boards in lower foreground"
            ],
            "visual_inferences": [
              "fixed_element dense_harbor_fog: A thick, pervasive gray fog blankets the coastal harbor and the sea, muted cold blue-gray ambient lighting",
              "The wet dock boards reflect the dim ambient light, emphasizing the damp and lonely atmosphere",
              "Boat's hull volume is preserved with faint moisture highlights rather than rendering as a flat 2D silhouette"
            ],
            "creative_decisions": [
              "Low angle foreground anchor (wet dock boards) establishes spatial depth before the fog swallows the background",
              "Focus firmly placed on the boat's bow to emphasize its sudden emergence from the bleak isolation",
              "Mid-motion freeze used for the water trailing off the hull to convey the slow, ominous approach"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "c8a7526dac51e00d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "bdd4ae438ee3f2e8",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "독립적인 시공간의 설정 샷으로 이전 씬의 물리적 배경이나 인물 배치를 연속적으로 참조하지 않음",
        "_shot_index": 3,
        "visible_entities": [
          "P05",
          "P13",
          "L18",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At the pier edge, use a wide shot (WS), low angle with a slightly long lens, aimed straight into the fog as established by the flow. The old fishing boat's bow appears center-frame as a half-revealed black silhouette cutting the water, with wet dock boards in the lower foreground and most of the hull swallowed by the gray fog bank.",
            "lighting_mood": "A cold coastal haze desaturates the harbor into blue-gray layers, leaving the boat as a nearly black omen against pale fog.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P05",
              "P13",
              "L18",
              "L19"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "not_applicable",
            "bg_id": null,
            "reference_usage": "none",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "no chain_bg is bound to this shot — describe the location freely without referencing a background image",
              "do not use 'from the reference' / 'the existing room' / 'preserving the room' style phrasing — there is no reference image to refer to"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dense_harbor_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A thick, pervasive gray fog blankets the coastal harbor and the sea, severely limiting background visibility. The ambient lighting is a muted, cold blue-gray, creating a damp atmosphere that softens distant shapes and desaturates the overall environment.",
                "applies_to_shots": [
                  3,
                  6,
                  9
                ],
                "source_facts": [
                  "Scene text states the rain stopped and thick fog rolled in (비는 그치고 안개가 자욱하다)",
                  "Shot 3 explicitly mentions 'gray fog bank' and 'blue-gray layers'",
                  "Shot 6 references 'Flat blue-gray fog light softens the background'",
                  "Shot 9 notes 'foggy water' and 'Muted coastal blue-gray light'"
                ],
                "visual_inferences": [
                  "The fog acts as a natural light diffuser, removing harsh shadows and rendering the illumination flat and gloomy",
                  "Environmental surfaces such as the dock boards appear damp or wet due to the recent rain and heavy fog"
                ],
                "creative_decisions": [
                  "Using the thick fog to visually isolate the setting from the rest of the world, emphasizing the bleak, lonely mood of the isolated harbor"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "2d39136d819f90c9"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "안개를 뚫고 다가온 배의 주인 인우",
        "representative_moment": "인우(C03)가 밧줄을 쥔 채 안개 속 포구에 서 있는 수리영(C01)을 힐끗 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close-up, slight over-the-shoulder geometry, cool blue-gray fog lighting with damp highlights.",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level, head-and-shoulder composition from just forward of the man's shoulder. C03O04 in a green waterproof jacket, a young East Asian man, at three-quarter angle from the right in the foreground, turning his head back across the frame, his indifferent eyes fixed on the distant figure. A wet mooring rope is held low, crossing the lower frame edge. Filling the left frame edge is an old, damp fishing boat gunwale with chipped paint. Sharing a single line of sight across the wet stone pier, C01O02 in a navy windbreaker, a young East Asian woman, stands in the deep background as a soft out-of-focus silhouette, at three-quarter angle from the left, mid-stride paused with one foot slightly ahead, eyes fixed on him. Focus on the quiet tension in the foggy space between them. [L18: pervasive thick gray fog blanketing the coastal harbor, severely limiting visibility]. Flat blue-gray fog light softens the distant shapes, while damp highlights catch on the man's cheek and the rough rope, maintaining a gritty, cold atmosphere.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "Scene text: 인우는 닷줄을 고정시키고 있다.",
              "Shot 6 description: 밧줄을 손에 쥔 채 고개를 돌려 수리영을 힐끗 응시하는 인우의 무심한 눈빛.",
              "Observer POV looking at In-woo's face from near the boat."
            ],
            "visual_inferences": [
              "fixed_element dense_harbor_fog applies: thick, pervasive gray fog acting as a natural light diffuser.",
              "Su-ri-young is in the deep background, so she is rendered as a soft out-of-focus silhouette to satisfy close framing scale rules.",
              "The boat's gunwale and the mooring rope anchor the foreground geometry."
            ],
            "creative_decisions": [
              "Used a reverse over-the-shoulder perspective to capture In-woo's expression while keeping Su-ri-young visible in his eyeline.",
              "Introduced damp highlights on the skin and rope to add gritty texture against the flat, blue-gray ambient fog.",
              "Described the shared surface (wet stone pier) to visually connect the foreground and background figures."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "777a37b0f754f099",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "146e8f1f047d2725",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "Shot 3의 안개 낀 포구 배경 설정을 이어받으나, close framing 조건에 따라 배경 지리 정보보다 빛과 안개의 질감 중심(atmosphere reference)으로 집중함.",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "C03",
          "P05",
          "P13",
          "L18",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From close beside the boat, tighten the flow into a close-up (CU), eye-level, slight over-the-shoulder geometry from just forward of 인우's shoulder back toward his face. The rope remains implied along the lower edge while 인우's indifferent glance lands across frame toward 수리영, who is held smaller in the pier background along his eyeline.",
            "lighting_mood": "Flat blue-gray fog light softens the background while damp highlights on rope and skin keep the close-up gritty and restrained.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C03",
              "P05",
              "P13",
              "L18",
              "L19"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dense_harbor_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A thick, pervasive gray fog blankets the coastal harbor and the sea, severely limiting background visibility. The ambient lighting is a muted, cold blue-gray, creating a damp atmosphere that softens distant shapes and desaturates the overall environment.",
                "applies_to_shots": [
                  3,
                  6,
                  9
                ],
                "source_facts": [
                  "Scene text states the rain stopped and thick fog rolled in (비는 그치고 안개가 자욱하다)",
                  "Shot 3 explicitly mentions 'gray fog bank' and 'blue-gray layers'",
                  "Shot 6 references 'Flat blue-gray fog light softens the background'",
                  "Shot 9 notes 'foggy water' and 'Muted coastal blue-gray light'"
                ],
                "visual_inferences": [
                  "The fog acts as a natural light diffuser, removing harsh shadows and rendering the illumination flat and gloomy",
                  "Environmental surfaces such as the dock boards appear damp or wet due to the recent rain and heavy fog"
                ],
                "creative_decisions": [
                  "Using the thick fog to visually isolate the setting from the rest of the world, emphasizing the bleak, lonely mood of the isolated harbor"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5a9866959b85a446"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "수리영의 결심과 메시지",
        "representative_moment": "C01 leaves a voice message on P05 while looking out at the foggy sea, ready to depart.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium close-up, slight high angle, left third profile composition, muted coastal blue-gray lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a navy windbreaker, a young East Asian woman, occupies the left third of the frame in a clean right profile. Shot in a medium close-up from a slight high angle, her head and shoulders are clearly visible against the mist. Her eyes are fixed forward on the distant gray sea. She holds a small dark smartphone, P05, close to her mouth, the screen turned away from the camera, with its edge catching a faint cold highlight. Muted coastal blue-gray light wraps her face in damp softness. Focus on her expression and the phone at her lips. [L18: Dense, pervasive gray harbor fog acts as a soft, desaturated background directly behind her, severely limiting visibility, with a blurred, out-of-focus wet pier railing edge in the lower frame and the faint shape of a moored boat hull in the mist].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "수리영, 떠나기전, 바다를 바라보며 음성메시지를 남긴다.",
              "안개가 자욱하다.",
              "Shot description: 핸드폰을 입가에 댄 채 바다를 바라보는 수리영의 측면."
            ],
            "visual_inferences": [
              "fixed_element dense_harbor_fog: pervasive gray fog acts as a soft, desaturated background",
              "Muted coastal blue-gray light wraps her profile in damp softness",
              "Phone screen turned away, catching a faint cold highlight"
            ],
            "creative_decisions": [
              "Slight high angle MCU in the left third to isolate her profile against the dense fog",
              "Blurred boat hull and wet railing at the frame edges to anchor the harbor setting while maintaining close framing rules"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "dcbeec34615ec4af",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "650b1d399555aeb5",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "Background environment relies on the dense harbor fog established in S26 Shot 3.",
        "_shot_index": 9,
        "visible_entities": [
          "C01",
          "P05",
          "P13",
          "L18",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Settle the flow's seaward-side track into a near-static medium close-up (MCU), slight high angle, profile framing across 수리영's cheek line toward the foggy water. 수리영 occupies the left third in clean side profile with the phone at her mouth, while the waiting boat and gray sea sit beyond her gaze rather than showing her boarding yet.",
            "lighting_mood": "Muted coastal blue-gray light wraps her profile in damp softness, with the phone and lips catching the faintest cold highlight.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P05",
              "P13",
              "L18",
              "L19"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": null,
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dense_harbor_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A thick, pervasive gray fog blankets the coastal harbor and the sea, severely limiting background visibility. The ambient lighting is a muted, cold blue-gray, creating a damp atmosphere that softens distant shapes and desaturates the overall environment.",
                "applies_to_shots": [
                  3,
                  6,
                  9
                ],
                "source_facts": [
                  "Scene text states the rain stopped and thick fog rolled in (비는 그치고 안개가 자욱하다)",
                  "Shot 3 explicitly mentions 'gray fog bank' and 'blue-gray layers'",
                  "Shot 6 references 'Flat blue-gray fog light softens the background'",
                  "Shot 9 notes 'foggy water' and 'Muted coastal blue-gray light'"
                ],
                "visual_inferences": [
                  "The fog acts as a natural light diffuser, removing harsh shadows and rendering the illumination flat and gloomy",
                  "Environmental surfaces such as the dock boards appear damp or wet due to the recent rain and heavy fog"
                ],
                "creative_decisions": [
                  "Using the thick fog to visually isolate the setting from the rest of the world, emphasizing the bleak, lonely mood of the isolated harbor"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "6ffc5ee05fbc125d"
      },
      {
        "scene_index": 27,
        "heading": "S#27. 옥탑방 안 / 해질 무렵",
        "beat_title": "수리영의 메시지를 확인하며 밀려오는 불안",
        "representative_moment": "C02 stands in the dim, ransacked room, holding a phone to her ear with an anxious, downward gaze.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium close-up, intimate observer framing, sickly green-gray dusk lighting.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level intimate observer framing, head-and-shoulder composition. C02O03 in a gray leather jacket, a young Asian woman, standing at three-quarter angle from the left, occupying the center frame. A smartphone is pressed to her ear, eyes looking down in anxious focus. Sickly green-gray interior gloom mixes with cool dying dusk light, reflecting on her cheek and the phone's edge, creating a cold, flat wash across her features. [L07: The background consists of soft-focus frame-edge elements of a messy, ransacked rooftop room, scattered objects and debris lying around in dim shadows behind her]. Focus on her tense facial expression and the phone.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#27 action: 수리영의 녹음메시지를 확인하는 혜수",
              "Shot description: 엉망이 된 옥탑방 거실 한가운데 서서 핸드폰을 귀에 댄 혜수의 심각한 얼굴",
              "DP direction: three_quarter_left, phone pressed to ear, eyes→down"
            ],
            "visual_inferences": [
              "fixed_element: The interior of an old rooftop room is left in a messy, ransacked state with scattered objects in broken layers.",
              "fixed_element: heavily shadowed and enveloped in a cold, sickly green-gray gloom, dimly illuminated by dusk.",
              "C02's tense shoulder posture reflecting her anxious state while listening to the message."
            ],
            "creative_decisions": [
              "Head-and-shoulder framing aligns with 'close' scale, avoiding 'face-filling' errors while keeping the subject central.",
              "Soft-focus background description via [L07] complies with skipped_close_framing policy (no reference image mentioned) while maintaining the ransacked environment.",
              "Lighting described as 'reflecting on her cheek' to prevent harsh slicing/cutting effects on the body."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "47735ca4c5b55b0e",
              "owned_hash": "80f679b464a34fb0",
              "camera_direction_hash": "32d2be677a626134",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "S12_Shot20 establishes the rooftop background, though background reference is skipped for this close framing, continuity of mood and spatial state is preserved.",
        "_shot_index": 1,
        "visible_entities": [
          "C02",
          "P05",
          "L04",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Begin the scene flow with a medium close-up (MCU), eye-level, intimate observer framing about two meters in front of 혜수, tightened so her face and phone dominate center frame. The ransacked rooftop room stays visible behind her in broken layers, but the composition holds on her anxious listening before the camera will later slide away toward the entrance.",
            "lighting_mood": "Sickly interior green-gray mixes with dying dusk, flattening 혜수's face while the room behind her feels emptied and cold.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C02",
              "P05",
              "L04",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_dusk_ransacked_windy",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "ransacked_rooftop_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of an old rooftop room is left in a messy, ransacked state with scattered objects and debris lying around in broken layers. The entire space is heavily shadowed and enveloped in a cold, sickly green-gray gloom, dimly illuminated by the fading light of dusk.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "source_facts": [
                  "Shot 1: The ransacked rooftop room stays visible behind her in broken layers",
                  "Shot 1: Sickly interior green-gray mixes with dying dusk",
                  "Shot 4: gray-green interior gloom",
                  "Shot 4: cold dusk light leaks through"
                ],
                "visual_inferences": [
                  "The chaotic placement of objects from being ransacked remains untouched across the scene.",
                  "The ambient light level is consistently dim, relying entirely on the minimal dusk light leaking from outside."
                ],
                "creative_decisions": [
                  "Maintain a consistent green-gray color grading to emphasize the bleak, empty, and anxious atmosphere of the scene, visually tying the isolated frames together."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 20,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "4ca22c07a7ffe698"
      },
      {
        "scene_index": 27,
        "heading": "S#27. 옥탑방 안 / 해질 무렵",
        "beat_title": "불안을 증폭시키는 황량한 현관문 소리",
        "representative_moment": "강한 바람에 덜컹이는 낡은 현관 철문의 좁은 틈새 사이로 스산한 저녁 빛이 새어 들어온다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle close-up on the metal door gap, sickly green-gray shadow contrasting with cold dusk light",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the narrow gap of an old metal entrance door left slightly open. The heavy, worn door edge occupies the right side of the frame, angled slightly toward the camera. [L07: Worn concrete threshold and a bare, scuffed lower doorframe edge, heavily shadowed in a cold, sickly green-gray interior gloom]. A thin blade of gray dusk light leaks sharply through the narrow opening, falling across the dusty floor just inside the entrance. The immediate surroundings remain bleak and dim, emphasizing the tight framing.",
            "outfit_assignments": [],
            "source_facts": [
              "S#27 action: '덜커덩 덜커덩. 바람에 현관문 소리. 황량하다.'",
              "Shot 4 description: old metal entrance door slightly open, rattling in wind.",
              "Shot 4 lighting: A thin blade of cold dusk light leaks through the metal door gap into otherwise gray-green interior gloom."
            ],
            "visual_inferences": [
              "fixed_element: interior enveloped in a sickly green-gray gloom",
              "Low angle composition anchors the bottom edge of the door and the concrete threshold in the lower frame, aligning with the ground-level perspective."
            ],
            "creative_decisions": [
              "Strict close framing applied to comply with 'skipped_close_framing' rule — omitted the broader ransacked room layout, restricting background details entirely to the immediate [L07] frame-edge surfaces.",
              "Used 'falling across' instead of 'cutting' for the light beam to maintain safe, surface-based lighting terminology.",
              "Emphasized the strong contrast between the exterior cold light and the green-gray interior shadows to visually represent the encroaching anxiety."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "48748a77d6d94013",
              "owned_hash": "80f679b464a34fb0",
              "camera_direction_hash": "70cf50605a58524f",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "동일한 옥탑방 내부 배경이 참조되나, 이번 샷은 문틈 클로즈업(skipped_close_framing)이므로 방 전체 레퍼런스를 제외하고 인접한 프레임 엣지(문지방, 문틀)의 톤 앤 매너만 유지함.",
        "_shot_index": 4,
        "visible_entities": [
          "P05",
          "L04",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "End the flow near the entrance with a close-up (CU), low angle, static through-gap composition on the old metal door about one meter away. The narrow opening sits just off-center, showing a sliver of exterior gray light while the door edge shudders in the wind, making the sound source feel like a presence pressing into the room.",
            "lighting_mood": "A thin blade of cold dusk light leaks through the metal door gap into otherwise gray-green interior gloom, turning the rattle into a visual threat.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "P05",
              "L04",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "bg_living_kitchen_dusk_ransacked_windy",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "ransacked_rooftop_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of an old rooftop room is left in a messy, ransacked state with scattered objects and debris lying around in broken layers. The entire space is heavily shadowed and enveloped in a cold, sickly green-gray gloom, dimly illuminated by the fading light of dusk.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "source_facts": [
                  "Shot 1: The ransacked rooftop room stays visible behind her in broken layers",
                  "Shot 1: Sickly interior green-gray mixes with dying dusk",
                  "Shot 4: gray-green interior gloom",
                  "Shot 4: cold dusk light leaks through"
                ],
                "visual_inferences": [
                  "The chaotic placement of objects from being ransacked remains untouched across the scene.",
                  "The ambient light level is consistently dim, relying entirely on the minimal dusk light leaking from outside."
                ],
                "creative_decisions": [
                  "Maintain a consistent green-gray color grading to emphasize the bleak, empty, and anxious atmosphere of the scene, visually tying the isolated frames together."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 20,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C02O03",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "5a0e8e35e186f887"
      },
      {
        "scene_index": 28,
        "heading": "바다 + 갑판 / 해질 무렵",
        "beat_title": "수리영이 내민 사진과 '금월' 글씨",
        "representative_moment": "Focus on the worn black-and-white photograph and a fingertip.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up (ECU), high-angle macro frame with shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up, high-angle macro frame looking down. Focus on an old, worn black-and-white photograph (P08) held against the surface by the fingertip of a young East Asian woman. The photograph's surface reveals worn paper fibers, white salt stains, and a curled corner, with tiny handwritten text visible near the upper right and a faint crimson-brown stain catching the light. A folded paper map (P12) rests partially visible and softly blurred at the upper frame edge. The photo sits directly on [L19: wet wooden fishing boat deck planks, scratched and darkened by sea spray]. Cold dusk-blue ambient light skims the damp deck, creating a dim, moody atmosphere while shallow depth of field isolates the sharp paper texture from the blurred wooden background.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 3 description: 수리영의 손가락 끝에 들려 있는 낡은 흑백 사진과 그 구석에 적힌 '금월'이라는 글씨의 클로즈업.",
              "scene heading: 바다 + 갑판 / 해질 무렵",
              "beat action: 수리영이 내민 사진과 '금월'이라는 글씨를 보고 극도로 당황"
            ],
            "visual_inferences": [
              "fixed_element dusk_ambient_lighting: cold dusk-blue ambient light skims the damp deck",
              "Since the shot is an ECU of a fingertip and a photo, body_part_focus_rule applies, describing the subject as a young East Asian woman's fingertip instead of using C01 ID.",
              "The background is restricted to the immediate frame-edge surface of the boat deck due to macro framing."
            ],
            "creative_decisions": [
              "Used a high-angle macro perspective hovering inches above the wet deck to emphasize the texture of the old photograph and the handwritten text.",
              "Applied shallow depth of field to blur the deck and the map at the frame edge, focusing entirely on the fingertip, the paper, and the occult-tinged crimson-brown stain.",
              "Infused the scene with a cold dusk-blue ambient light to match the dim, chilling mood of the confrontation."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "5952df87e3653e89",
              "owned_hash": "36194228037de9ee",
              "camera_direction_hash": "f1e85ae5f15a8a38",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on a prior scene for this specific macro detail shot, though it shares the environment with surrounding shots.",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "P08",
          "P12",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Direct observer view derived from the low close-observation flow: an extreme close-up (ECU), high angle macro frame hovers inches above the wet deck, angled down onto the old black-and-white photograph. The tiny handwritten 'Geumwol' in the corner sits near the upper right of frame, while 수리영's fingertip anchors the lower edge at natural scale; the worn paper fibers, salt stains, and curled photo corner are emphasized with shallow DOF.",
            "lighting_mood": "Cold dusk-blue ambient light skims the damp deck, with a faint crimson-brown stain in the photograph corner giving the clue an occult charge.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P08",
              "P12",
              "L19"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_deck_exterior_dusk_normal",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_ambient_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior of the small boat is enveloped in a cold, dusk-blue ambient light. This fading evening illumination creates a dim, moody atmosphere across the deck and exterior surfaces. The low light casts a desaturated, chilly tone over the surroundings, indicating the late hour on the water.",
                "applies_to_shots": [
                  3,
                  8
                ],
                "source_facts": [
                  "scene heading: 해질 무렵 (around dusk)",
                  "Shot 3 lighting: Cold dusk-blue ambient light skims the damp deck",
                  "Shot 8 lighting: Dying coastal dusk"
                ],
                "visual_inferences": [
                  "The overall ambient lighting remains consistently dim and bluish-gray across the boat's exterior during the short time frame of the scene."
                ],
                "creative_decisions": [
                  "Focusing on the cold dusk lighting as an environmental anchor to maintain visual consistency across drastically different shot scales."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "c591e093acca7d72"
      },
      {
        "scene_index": 28,
        "heading": "S#28. 바다 + 갑판 / 해질 무렵",
        "beat_title": "조타실 입구를 막아선 수리영",
        "representative_moment": "C01이 조타실 입구를 두 팔로 막아서고, C03이 그 안에서 멈칫하며 대치하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level observer view, direct framing of the doorway, dying coastal dusk with sickly green-gray interior spill.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level observer view from the exterior deck. Focus on the tense space between two figures at the narrow doorway they both occupy. In the foreground, C01O02 in a navy windbreaker, a young Asian woman, seen from behind with her jaw contour visible in slight profile, full body in frame, arms braced wide across the open sliding door from the reference, her boots planted on the wet deck. Her eyes are fixed on the figure inside. Trapped beyond her in the dim wheelhouse from the reference, C03O04 in a green waterproof jacket, a young Asian man, stands at a three-quarter left angle, halted at the helm console from the reference, his eyes fixed on her. Dying coastal dusk casts a cold, dusk-blue ambient light over the exterior deck, while a sickly green-gray spill from the interior silhouettes C01O02, her body volume and clothing folds preserved against the glow.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "scene heading: 해질 무렵 (around dusk)",
              "Shot 8 lighting: Dying coastal dusk",
              "action: 인우가 발작적으로 일어나 조타실로 달려가 뱃머리를 돌리려 하자, 수리영이 따라 들어가 막아선다."
            ],
            "visual_inferences": [
              "fixed_element dusk_ambient_lighting: The exterior of the small boat is enveloped in a cold, dusk-blue ambient light.",
              "Suri-young's back-to-camera silhouette requires subtle rim lighting to preserve body volume, ensuring her face profile is slightly visible to support ID binding.",
              "In-woo is framed partially visible behind the physical barricade of Suri-young's arms inside the cramped wheelhouse."
            ],
            "creative_decisions": [
              "Positioned the camera outside the wheelhouse on the deck to capture Suri-young's full body blocking the narrow doorway.",
              "Used a sickly green-gray interior spill to contrast with the cold dusk-blue exterior, heightening the tension and highlighting Suri-young's silhouette."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "1845aa7695c35803",
              "owned_hash": "36194228037de9ee",
              "camera_direction_hash": "d04156ebb659e32b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "sliding door",
                  "violating_phrase": "the open sliding door from the reference",
                  "reason": "The phrase references an existing sliding door from the reference; it does not instruct creating or altering it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wheelhouse",
                  "violating_phrase": "the dim wheelhouse from the reference",
                  "reason": "The wheelhouse is explicitly referenced as already present from the reference, so this is an anchor mention.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "helm console",
                  "violating_phrase": "at the helm console from the reference",
                  "reason": "The helm console is mentioned as an existing reference object, not as something to add or redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 28,
        "dependency_reason": "동일 씬 내 이전 샷(Shot 3)의 조타실 외부 배경과 황혼 조명(dusk_ambient_lighting)의 일관성을 유지하기 위해 exact_background 참조 활용.",
        "_shot_index": 8,
        "visible_entities": [
          "C01",
          "C03",
          "P08",
          "P12",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Direct observer view from just outside the wheelhouse entrance: a wide shot (WS), eye-level, static doorway frame holds 수리영 full-body in the center with both arms spread across the narrow opening. The camera stays far enough back to keep her boots, shoulders, and outstretched hands visible, while 인우 remains partially trapped beyond her in the dim wheelhouse, seen through the gap between her arm and the doorframe.",
            "lighting_mood": "Dying coastal dusk silhouettes 수리영 against sickly green-gray wheelhouse spill, turning her blocking posture into a tense human barricade.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "C03",
              "P08",
              "P12",
              "L19"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "cb_deck_exterior_dusk_normal",
            "reference_usage": "exact_background",
            "owned_objects": [
              "boat",
              "cleat",
              "deck",
              "deck hatch",
              "fishing rod rack",
              "fog",
              "helm console",
              "net bin",
              "rail",
              "rope coil",
              "sea",
              "sliding door",
              "wheelhouse",
              "winch",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusk_ambient_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior of the small boat is enveloped in a cold, dusk-blue ambient light. This fading evening illumination creates a dim, moody atmosphere across the deck and exterior surfaces. The low light casts a desaturated, chilly tone over the surroundings, indicating the late hour on the water.",
                "applies_to_shots": [
                  3,
                  8
                ],
                "source_facts": [
                  "scene heading: 해질 무렵 (around dusk)",
                  "Shot 3 lighting: Cold dusk-blue ambient light skims the damp deck",
                  "Shot 8 lighting: Dying coastal dusk"
                ],
                "visual_inferences": [
                  "The overall ambient lighting remains consistently dim and bluish-gray across the boat's exterior during the short time frame of the scene."
                ],
                "creative_decisions": [
                  "Focusing on the cold dusk lighting as an environmental anchor to maintain visual consistency across drastically different shot scales."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 28,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "cb_deck_exterior_dusk_normal",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "f753e800d0ac299a"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "엄마의 행방을 밝히며 절규하는 수리영",
        "representative_moment": "C01이 화면 우측을 향해 절박하게 소리치며 일그러진 얼굴을 한 클로즈업",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight low-angle close-up (CU), sickly fluorescent and blue-gray dusk lighting, shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. A tight low-angle close-up framed from slightly below. C01O02 in a navy windbreaker, a young East Asian woman, occupies slightly left of center at a three-quarter angle from the right. She is leaning forward in a desperate stance, mouth open, jaw muscles strained, her reddened eyes fixed on an unseen figure just outside the right frame. Her neck and shoulders remain visible in the lower frame. Focus on her distressed, tearful expression. Sickly, harsh greenish-yellow fluorescent light washes across the right side of her face and jawline, while cold blue-gray dusk ambient light pools on her left shoulder. [L20: The immediate background melts into a soft, claustrophobic blue-gray blur, revealing faint, out-of-focus rows of dark crimson circular markings on a dim wall behind her and a thin, fogged vertical window edge on the far left].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot 3: 눈가를 붉힌 채 입을 크게 벌린 수리영의 절박하고 일그러진 얼굴 클로즈업.",
              "Scene text: (분노) 우리 엄마가 거기 잡혀있단 말이에요!",
              "shot description: 수리영: three_quarter_right, leaning into plea"
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_dusk_lighting: harsh greenish-yellow cabin light mixing with cold blue-gray dusk spill",
              "fixed_element red_circular_wall_markings: incorporated as blurred out-of-focus crimson circles in the soft background",
              "Kept neck and shoulders visible in the lower frame to prevent floating head artifact per close framing rules",
              "In-woo is framed out as an unseen figure to the right to maintain focus exclusively on C01's face"
            ],
            "creative_decisions": [
              "Low-angle camera emphasizes her desperate and commanding emotional output while keeping the claustrophobic space imposing.",
              "Maintained a heavily blurred background to follow skipped close framing constraints while still nodding to the continuous environment elements (red marks, dusk light)."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "86e5e24dff603633",
              "owned_hash": "3dcdffa44980a305",
              "camera_direction_hash": "e478caefc8d825a4",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "P08",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Direct observer view at 수리영's eyeline: a tight close-up (CU), low angle, pushes in from slightly below her face so her reddened eyes, open mouth, and strained jaw muscles occupy most of the frame without flattening into a frontal portrait. She is framed slightly left of center in three-quarter view, with the cramped wheelhouse melting into blue-gray blur behind her as she pleads about her mother.",
            "lighting_mood": "Sickly fluorescent interior light mixes with cold dusk spill, reddening her eyes while leaving the background in a bruised blue-gray haze.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P08",
              "L20"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_wheelhouse_interior_dusk_red_circle_marks",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the wheelhouse is illuminated by a constant, unsettling dual-tone light. A sickly, harsh greenish-yellow fluorescent light from the cabin fixtures mixes heavily with the cold, bruised blue-gray spill of dusk coming from outside, creating a murky and oppressive atmosphere.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "source_facts": [
                  "Shot 3: Sickly fluorescent interior light mixes with cold dusk spill, reddening her eyes while leaving the background in a bruised blue-gray haze.",
                  "Shot 5: harsh greenish cabin light with cold blue dusk leaking",
                  "Shot 7: Muted blue-gray cabin darkness... sickly fluorescent spill"
                ],
                "visual_inferences": [
                  "The ambient light sources remain constant throughout the short dialogue exchange, casting consistent color temperatures across different angles."
                ],
                "creative_decisions": [
                  "Defined the specific color palette (greenish-yellow vs blue-gray) as an environment state to ensure the claustrophobic and tense mood is maintained across all tight and macro shots."
                ],
                "confidence": "high"
              },
              {
                "element_id": "red_circular_wall_markings",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The dark, muted interior walls of the wheelhouse are densely covered with numerous crude, red circular markings arranged in rows. The crimson paint has a slightly wet or glossy texture that contrasts sharply against the grim, dimly lit background of the cabin.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "source_facts": [
                  "Scene text: 조타실안 수많은 원... 붉은 원!",
                  "Shot 7: dark wheelhouse wall fills the center and right with rows of red circular markings.",
                  "Shot 7: sharp crimson of the circles... wall texture feel wet and real."
                ],
                "visual_inferences": [
                  "Although explicitly revealed as a focal point in Shot 7, these markings are physically painted on the walls and would exist in the background environment of Shot 3, even if obscured or heavily blurred by the shallow depth of field."
                ],
                "creative_decisions": [
                  "Excluded from Shot 5 as it is an extreme macro shot pointing downward at a photograph where walls would not be visible. Included in Shot 3 and 7 to ground the spatial continuity of the cabin."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "9da983ebfbcfeaab"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "사진 속 소녀의 얼굴을 가리키는 수리영",
        "representative_moment": "흙이 묻은 수리영의 검지손가락이 낡은 사진 속 어린 소녀의 얼굴을 꾹 누르고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "high angle macro composition focusing on the fingertip pressing the photograph",
            "t2i_prompt": "Photorealistic cinematic still. A dirt-marked index finger of a young East Asian woman presses firmly down onto the upward-facing surface of a creased, faded black-and-white photograph. Focus on the grimy fingertip resting directly on the printed face of a young East Asian girl in the photo, partially obscuring the printed features. The photograph fills the center of the frame, excluding surrounding hands. Only the white border of the photo and a sliver of [L20: scratched, dark grimy counter surface] are visible at the lower frame edge for scale. The surface is illuminated by harsh greenish-yellow fluorescent light mixed with a cold blue-gray dusk spill, washing across the paper grain and making the dirt on the finger look almost black.",
            "outfit_assignments": [],
            "source_facts": [
              "S29 action: '(사진속의 한 아이를 가르키며) 이 사진속의 얘가 우리 엄마예요.'",
              "Shot extract: '낡은 사진 속 어린 소녀의 얼굴을 꾹 누른 수리영의 흙 묻은 검지손가락 클로즈업.'"
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_dusk_lighting: harsh greenish cabin light with cold blue dusk leaking",
              "fingertip partially obscures the printed face under pressure",
              "frame compressed to exclude surrounding hands, showing only the interaction point"
            ],
            "creative_decisions": [
              "Applied body part focus and reproduction surface rules by replacing character IDs with common nouns and demographic descriptors.",
              "Used tight macro framing descriptions ('fills the center', 'sliver of counter surface') to replace explicit camera instructions like ECU or high angle.",
              "Described the dual-tone lighting interaction directly on the photo surface and finger."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a8dced295459c392",
              "owned_hash": "3dcdffa44980a305",
              "camera_direction_hash": "c68e2742a0a4a8e4",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "Same environment and lighting as previous shots in the wheelhouse sequence, focusing on specific evidence detail.",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "P08",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Direct observer view continuing the downward evidence move: an extreme close-up (ECU), high angle macro shot looks down at the photograph held between the two people, compressing the frame to 수리영's dirt-marked index finger pressing the young girl's face. The girl's face sits just right of center under the fingertip, while the surrounding hands are mostly excluded and only the photo border and a sliver of shadowed wheelhouse surface remain for scale.",
            "lighting_mood": "The macro frame is lit by harsh greenish cabin light with cold blue dusk leaking across the photo grain, making the fingertip's dirt look almost black.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C01",
              "P08",
              "L20"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "cb_wheelhouse_interior_dusk_red_circle_marks",
            "reference_usage": "skipped_close_framing",
            "owned_objects": [],
            "camera_reference": null,
            "close_framing_skips_background_ref": true,
            "constraints": [
              "this shot uses close framing — the background reference is intentionally omitted at composition time",
              "do not mention the existing room, the chain_bg reference image, or any item from the owned_objects list",
              "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', 'preserving the same room perspective', 'maintaining the reference's framing', 'do not generate a new X' — these phrases are invalid when the reference is absent",
              "do not use any of: 'matching the reference camera', 'deviation from reference', 'same … angle as the reference', 'match the reference framing' — Rule A close-framing invalidation: close framing has no reference camera to match or deviate from",
              "compose the close subject from its immediate surroundings only — use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the wheelhouse is illuminated by a constant, unsettling dual-tone light. A sickly, harsh greenish-yellow fluorescent light from the cabin fixtures mixes heavily with the cold, bruised blue-gray spill of dusk coming from outside, creating a murky and oppressive atmosphere.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "source_facts": [
                  "Shot 3: Sickly fluorescent interior light mixes with cold dusk spill, reddening her eyes while leaving the background in a bruised blue-gray haze.",
                  "Shot 5: harsh greenish cabin light with cold blue dusk leaking",
                  "Shot 7: Muted blue-gray cabin darkness... sickly fluorescent spill"
                ],
                "visual_inferences": [
                  "The ambient light sources remain constant throughout the short dialogue exchange, casting consistent color temperatures across different angles."
                ],
                "creative_decisions": [
                  "Defined the specific color palette (greenish-yellow vs blue-gray) as an environment state to ensure the claustrophobic and tense mood is maintained across all tight and macro shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "readiness_policy": "skipped_by_policy",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": true,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "55e471af9d34f555"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "붉은 원의 발견과 극심한 공포",
        "representative_moment": "C03의 어깨 너머로 조타실 어두운 벽면에 빼곡하게 그려진 붉은 원형 표식들이 기괴하게 드러난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level OTS composition, sharp focus on the background wall, muted blue-gray darkness with sharp crimson accents and a sickly fluorescent spill.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level composition looking past C03O04 in a green waterproof jacket, an East Asian man. He occupies the left foreground edge with his back to the camera, his rigid hunched shoulder and a narrow slice of his cheek visible in partial profile. Focus on the dark wall panel from the reference filling the center and right frame. The interior wall is densely covered with numerous crude, red circular markings arranged in rows. The crimson paint has a slightly wet, glossy texture. Muted blue-gray cabin darkness dominates the background, illuminated by a sickly greenish-yellow fluorescent spill from the ceiling. This ambient mix reflects faintly on C03O04's cheek and highlights the wet texture of the red circles, creating an oppressive, murky atmosphere.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "Shot 7: 인우의 어깨 너머 조타실 어두운 벽면에 빼곡하게 칠해진 붉은색 원형 표식들의 정지 구도.",
              "DP instruction: Muted blue-gray cabin darkness is punctured by the sharp crimson of the circles, with just enough sickly fluorescent spill to make the wall texture feel wet and real."
            ],
            "visual_inferences": [
              "fixed_element wheelhouse_dusk_lighting: The cramped interior of the wheelhouse is illuminated by a sickly greenish-yellow fluorescent light from the cabin fixtures mixing heavily with the bruised blue-gray spill of dusk.",
              "fixed_element red_circular_wall_markings: The dark interior walls are densely covered with numerous crude, red circular markings with a slightly wet or glossy texture."
            ],
            "creative_decisions": [
              "Placed C03O04 strictly on the left foreground edge in partial profile to serve as a framing element while maintaining sharp focus on the occult symbols.",
              "Used 'the dark wall panel from the reference' to explicitly anchor the background element according to the exact_background binding constraint.",
              "Ensured lighting effects only reflect on surfaces rather than cutting or slicing across the character's face."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "fb0cb0aa6158278a",
              "owned_hash": "3dcdffa44980a305",
              "camera_direction_hash": "05a44b010237961c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "wall panel",
                  "violating_phrase": "dark wall panel from the reference",
                  "reason": "The owned object is mentioned with an explicit reference phrase, which makes it an anchor reference rather than a request to newly create or modify it.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "Same wheelhouse location and timeline, preserving the established lighting and the presence of the occult red markings on the wall from prior shots.",
        "_shot_index": 7,
        "visible_entities": [
          "C03",
          "P08",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Over-the-shoulder perspective behind 인우: a medium shot (MS), eye-level, static frame places his shoulder and a narrow slice of his cheek along the left foreground edge while the dark wheelhouse wall fills the center and right with rows of red circular markings. The composition holds completely still after the reveal, minimizing 인우 as a scale reference so the crimson circles become the occult focal point without cutting away from the established axis.",
            "lighting_mood": "Muted blue-gray cabin darkness is punctured by the sharp crimson of the circles, with just enough sickly fluorescent spill to make the wall texture feel wet and real.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C03",
              "P08",
              "L20"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "cb_wheelhouse_interior_dusk_red_circle_marks",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench",
              "chair",
              "console",
              "dashboard",
              "display",
              "door",
              "fluorescent light",
              "radio microphone",
              "steering wheel",
              "storage locker",
              "switch panel",
              "throttle lever",
              "wall panel",
              "window",
              "windshield"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wheelhouse_dusk_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cramped interior of the wheelhouse is illuminated by a constant, unsettling dual-tone light. A sickly, harsh greenish-yellow fluorescent light from the cabin fixtures mixes heavily with the cold, bruised blue-gray spill of dusk coming from outside, creating a murky and oppressive atmosphere.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "source_facts": [
                  "Shot 3: Sickly fluorescent interior light mixes with cold dusk spill, reddening her eyes while leaving the background in a bruised blue-gray haze.",
                  "Shot 5: harsh greenish cabin light with cold blue dusk leaking",
                  "Shot 7: Muted blue-gray cabin darkness... sickly fluorescent spill"
                ],
                "visual_inferences": [
                  "The ambient light sources remain constant throughout the short dialogue exchange, casting consistent color temperatures across different angles."
                ],
                "creative_decisions": [
                  "Defined the specific color palette (greenish-yellow vs blue-gray) as an environment state to ensure the claustrophobic and tense mood is maintained across all tight and macro shots."
                ],
                "confidence": "high"
              },
              {
                "element_id": "red_circular_wall_markings",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The dark, muted interior walls of the wheelhouse are densely covered with numerous crude, red circular markings arranged in rows. The crimson paint has a slightly wet or glossy texture that contrasts sharply against the grim, dimly lit background of the cabin.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "source_facts": [
                  "Scene text: 조타실안 수많은 원... 붉은 원!",
                  "Shot 7: dark wheelhouse wall fills the center and right with rows of red circular markings.",
                  "Shot 7: sharp crimson of the circles... wall texture feel wet and real."
                ],
                "visual_inferences": [
                  "Although explicitly revealed as a focal point in Shot 7, these markings are physically painted on the walls and would exist in the background environment of Shot 3, even if obscured or heavily blurred by the shallow depth of field."
                ],
                "creative_decisions": [
                  "Excluded from Shot 5 as it is an extreme macro shot pointing downward at a photograph where walls would not be visible. Included in Shot 3 and 7 to ground the spatial continuity of the cabin."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O02",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "cb_wheelhouse_interior_dusk_red_circle_marks",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "8b16f34e1bf512de"
      },
      {
        "scene_index": 30,
        "heading": "S#30. 바다 / 해질 무렵",
        "beat_title": "해질 무렵 바다 위, 인우의 소형어선이 짙은 안개 띠 속으로 들어감",
        "representative_moment": "거대한 잿빛 안개벽을 정면으로 마주한 소형 어선의 원경 구도.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme wide establishing shot from far offshore, fading gold dusk drained into cold gray-blue haze",
            "t2i_prompt": "Photorealistic cinematic still. Extreme wide establishing shot, eye-level to the horizon just above the water. A small fishing boat, with its deck and wheelhouse from the reference, remains centered in the lower middle of the frame, caught mid-motion moving forward on its stern-to-bow axis, an engine wake trailing behind. The boat's bow is aimed straight into the towering gray fog wall from the reference that spans the entire horizon line. The open sea from the reference stretches outward, dark blue-gray and rippled, reflecting a muted, fading gold sunset glow. The warm dusk light is rapidly drained into a cold gray-blue haze against the opaque fog. Focus on the vast scale difference between the small boat and the overwhelming fog wall.",
            "outfit_assignments": [],
            "source_facts": [
              "S#30 action: 서서히 안개 안으로 들어가는 인우의 배",
              "shot description: 거대한 잿빛 안개벽을 정면으로 마주한 소형 어선의 원경 구도"
            ],
            "visual_inferences": [
              "No specific characters visible from this extreme distance",
              "Mid-motion state of the boat indicated by a trailing wake"
            ],
            "creative_decisions": [
              "Removed specific metric measurement (three meters) from DP notes to avoid T2I scale confusion, replacing it with 'just above the water'",
              "Anchored owned objects like fog, sea, deck, and wheelhouse to the provided background reference using 'from the reference' phrasing"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "675d4e4212f8ff5f",
              "owned_hash": "8b48a58b29003f6d",
              "camera_direction_hash": "970ffee42e28799f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "deck",
                  "violating_phrase": "its deck and wheelhouse from the reference",
                  "reason": "The phrase explicitly references the existing deck from the reference, so it is an anchor_reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wheelhouse",
                  "violating_phrase": "its deck and wheelhouse from the reference",
                  "reason": "The phrase explicitly references the existing wheelhouse from the reference, so it is an anchor_reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fog",
                  "violating_phrase": "the towering gray fog wall from the reference",
                  "reason": "The fog is described as an existing fog wall from the reference, which makes this an anchor_reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sea",
                  "violating_phrase": "The open sea from the reference",
                  "reason": "The sea is explicitly referenced as already present from the reference, so this is anchor_reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 28,
        "dependency_reason": "previous_shot_refs에 따른 연속적인 어선 및 안개 배경 유지 (exact_background)",
        "_shot_index": 2,
        "visible_entities": [
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 30,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Direct observer view from far offshore: an extreme wide / establishing shot (EWS), eye-level to the horizon from about three meters above the water, tracks behind the small fishing boat on its stern-to-bow axis. The boat remains small and centered in the lower middle of frame, its bow aimed into a towering gray fog wall that spans the entire horizon line, while the sea surface and sunset reflection stretch outward to dwarf it.",
            "lighting_mood": "Fading gold dusk is rapidly drained into cold gray-blue haze, making the fog wall feel like a physical boundary between worlds.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction specifies a vertical height/position (low / hip-height / overhead / ground level / quay level / floor level / from above) and the scene description includes frame-edge surfaces",
                "consistency_check_summary": "elements described inside the frame must be at vertical/depth positions consistent with the camera's height — low cameras place feet/lower-body in the lower frame, overhead cameras place head/shoulders in upper frame, hip-height cameras place torso in frame with head/feet implied beyond edges",
                "core_principles": [
                  "low cameras at ground/quay/floor level place feet and lower legs in the lower frame; chest-height frame-edge surfaces behind the subject are geometrically forbidden",
                  "overhead high angles from above place the top of head and shoulders in the upper-center frame; floor surfaces visible below feet at the lower frame edge are forbidden",
                  "hip-height side cameras place torso and arms in frame; head and feet are implied beyond frame edges, not both fully visible together",
                  "full body shots require either eye-level or high-angle framing where head and feet both fit; low cameras + full silhouette in one frame is forbidden"
                ],
                "forbidden_combinations": [
                  "low camera at ground/quay/floor level + frame-edge surface described at chest/waist height behind the subject",
                  "overhead high angle + feet visible at the lower frame edge with floor visible below them",
                  "hip-height side camera + full silhouette including head and feet visible in same frame",
                  "low angle looking up + ceiling and floor both fully visible in same frame"
                ],
                "recommended_phrasings": [
                  "low observer at ground level, shoes and lower legs occupying the lower frame, upper body extending toward the upper edge",
                  "overhead high angle from above, the top of head and shoulders fill the upper-center frame, the floor visible around them",
                  "at hip height beside the subject, torso and arms in frame, head and lower legs implied beyond frame edges",
                  "low angle looking up at the figure, ceiling lamps in the upper frame, the wall behind extending downward"
                ],
                "self_check_steps": [
                  "identify the camera position phrasing (height + angle)",
                  "list elements described inside the frame (foreground prop, body parts, background surfaces)",
                  "verify each element's vertical/depth placement is geometrically consistent with that camera position",
                  "if mismatch found, adjust frame-edge description to match camera position"
                ],
                "rationale_summary": "T2I 모델은 카메라 위치와 frame 안 요소 vertical 좌표 모순 시 절충 합성 — 인물이 가구에 박히거나 신체 일부가 잘리거나 prop 이 떠 있는 부자연스러운 결과"
              },
              "fg_bg_shared_anchor_rule": {
                "applies_when": "two characters share an interaction (dialogue / handing object / facing / co-watching) AND are described as foreground/background separated AND a shared surface or spatial anchor exists between them (bench / table / door / room)",
                "shared_anchor_required": "describe the shared surface or spatial anchor explicitly so both figures occupy the same physical space",
                "forbidden_phrasings": [
                  "fg/bg separation without naming the shared surface/space",
                  "isolated foreground hand reaching with another figure 'in the rear background' (no shared anchor named)",
                  "one figure 'in the foreground' and another 'in the back' without naming the room/surface they share"
                ],
                "recommended_keywords": [
                  "shared bench / shared table / shared surface",
                  "the same X they both occupy (X = bench, sofa, table, doorway, room)",
                  "across the X from each other",
                  "<prop> crosses the air between them (interaction prop visually links the two)",
                  "the <surface> sharing a single line of sight from the camera"
                ],
                "self_check_steps": [
                  "do the two characters share a single interaction (dialogue, handing, facing, co-watching)?",
                  "is one foreground and the other background-separated?",
                  "is the shared surface/space anchor explicitly named?",
                  "if not, add one of the recommended keywords"
                ],
                "rationale_summary": "fg/bg 분리만 묘사하면 모델이 두 인물을 다른 공간에 배치하거나 인터랙션이 끊긴 어색한 합성 — 공유 anchor 명시가 같은 물리적 공간 강제"
              },
              "primary_framing_rule": {
                "applies_when": "framing_scale ∈ {close, medium, insert} from `_derive_framing_scale()` (render_strategy.framing_scale, production enum). wide-class shots are mapped to medium and use `wide_medium_rules`. The LLM may *additionally* infer wide from prose keywords (`wide shot` / `전경` / `establishing` / `aerial`) for stricter checking — these are LLM-side reasoning hints, not the production framing_scale enum (RO-4 binding — card-only classification).",
                "framing_scale_keywords": {
                  "_comment": "LLM-facing reasoning hints — not the production framing_scale enum. card framing_scale is close/medium/insert from _derive_framing_scale(); wide is LLM hint only (RO-4 / RO-5 binding). Canary close-framing shot scope filter uses production _CLOSE_FRAMING_RE (9-entry alignment) — separate from this 11-entry LLM list.",
                  "close": [
                    "close-up",
                    "CU",
                    "MCU",
                    "ECU",
                    "XCU",
                    "extreme close-up",
                    "클로즈업",
                    "손가락이",
                    "손이",
                    "눈이",
                    "얼굴이"
                  ],
                  "wide": [
                    "wide shot",
                    "establishing",
                    "aerial",
                    "전경",
                    "전신"
                  ],
                  "medium_default": "medium / mid / two-shot — anything not matching close/wide keywords"
                },
                "close_framing_rules": {
                  "primary_subject_only_fully_visible": "the named primary subject (hand / face / object) is the only fully visible entity in the frame",
                  "other_entities_appearance_options": [
                    "partial visibility — shoulder slice / arm slice / sleeve / fingertips entering the frame edge",
                    "soft background — out-of-focus silhouette via shallow depth of field",
                    "absent — not rendered at all even if listed in visible_entities"
                  ],
                  "forbidden_combinations": [
                    "same character's full body and body-part close-up in the same frame (view mixing)",
                    "two characters both rendered as sharp close-up faces in the same frame"
                  ],
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "wide_medium_rules": {
                  "primary_and_secondary_both_visible": "primary subject + secondary entities all renderable",
                  "body_part_close_up_forbidden": "body-part close-up of any character is forbidden in wide/medium framing — close-up belongs in a separate shot",
                  "fg_bg_separation_requires_shared_anchor": "if two characters are rendered fg/bg separated, also apply fg_bg_shared_anchor_rule",
                  "body_part_focus_cross_ref": "see id_policy.body_part_focus_rule (G4.3 sub-field — body-part Focus 시 C##O## 금지)"
                },
                "self_check_steps": [
                  "identify framing_scale from camera_direction",
                  "if close: verify only primary subject is fully visible; other entities are partial / soft bg / absent",
                  "verify same character's full body + body-part close-up are not combined",
                  "if close: verify two faces are not both rendered sharp"
                ],
                "rationale_summary": "한 shot 안 framing scale 가 일관되어야 모델이 단일 카메라 셔터로 해석. close/wide/medium 혼합은 multi-camera 합성으로 인식되어 인물 분열 / 부위 분리 / 시점 혼합 합성"
              },
              "rationale_summary": "Rule F/G/J 의 spatial consistency 룰 통합 — camera 위치 vs frame edge 모순, fg/bg 분리 시 공유 anchor 누락, framing scale 혼합. 3 sub-rule 모두 single t2i_prompt = single camera shutter 원칙의 spatial 측면."
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L19"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "body-part close-up",
              "photo/poster/screen/mirror/reflection/projection depiction",
              "unregistered extra"
            ],
            "demographic_fallback_required": true,
            "face_identifiability_rule": {
              "use_entity_id_when": [
                "face identifiable: front, profile, three-quarter, or eyes closed",
                "OTS framing with any visible face"
              ],
              "common_noun_required_when": [
                "back to camera with no visible face",
                "silhouette or blurred outline only",
                "OTS with only back of head/shoulder, face entirely hidden"
              ],
              "id_use_summary": "C##/C##O## allowed only when face is identifiable AND framing is not dominated by an isolated body part",
              "rationale_summary": "C## 사용 시 얼굴 ref 가 자동 결합 — 얼굴이 안 보이는 인물에 C## 부착하면 ref 와 본문 묘사가 충돌"
            },
            "body_part_focus_rule": {
              "trigger_phrases": [
                "focus on",
                "close on",
                "tight on",
                "detail on"
              ],
              "applies_to": "any body part (face or non-face) when the framing is dominated by that part",
              "id_use": "forbidden — use a common noun + demographic descriptor instead",
              "common_noun_examples_generic": [
                "a trembling hand",
                "an exposed forearm",
                "the furrowed brow of a figure in shadow",
                "the clenched jaw of a figure in profile"
              ]
            },
            "close_framing_face_phrasing": {
              "forbidden_phrases": [
                "face filling the entire frame",
                "face filling nearly the entire frame",
                "her face fills the frame",
                "shoulders only entering the frame",
                "head snapped sideways",
                "his face fills the frame"
              ],
              "recommended_phrasings": [
                "tight framing on her face, upper body in frame",
                "close on his expression, shoulder visible at the edge",
                "head-and-shoulder composition, face occupying the center-right",
                "face in profile at the left, neck and upper chest visible"
              ],
              "rationale_summary": "T2I 모델은 얼굴이 프레임 전체를 가득 채우는 묘사를 받으면 몸과 분리된 얼굴만 공중에 떠 있는 합성을 낸다 — 어깨/상반신 일부를 프레임 안에 유지"
            },
            "reproduction_surface_rule": {
              "applies_to_surfaces": [
                "photograph",
                "poster",
                "painting",
                "portrait",
                "monitor",
                "TV",
                "mirror",
                "window reflection",
                "projection"
              ],
              "id_use": "forbidden — common noun + demographic descriptor only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면 속 얼굴이 사진 밖 실물 크기로 합성됨"
            },
            "demographic_descriptor_policy": {
              "required_on_first_appearance": true,
              "applies_to_id_forms": [
                "C##",
                "C##O##"
              ],
              "token_count_range": [
                1,
                2
              ],
              "components": {
                "ethnicity": [
                  "Asian",
                  "East Asian",
                  "South Asian",
                  "Southeast Asian",
                  "Black",
                  "Middle Eastern",
                  "Hispanic",
                  "Latina",
                  "Latino",
                  "Caucasian"
                ],
                "gender": [
                  "man",
                  "woman",
                  "figure"
                ],
                "age_band": [
                  "in his/her 20s",
                  "in his/her 30s",
                  "in his/her 40s",
                  "young",
                  "middle-aged",
                  "elderly"
                ],
                "role_hint_from_outfit": [
                  "in worker uniform",
                  "in fisher workwear",
                  "in detective coat",
                  "in business suit"
                ]
              },
              "format_template_a": "C##O## in <옷 1-3 단어>, <demographic descriptor>",
              "format_template_b": "C##O##, <demographic descriptor>, <자세 표현>",
              "source_priority": [
                "visual_world_rules.region",
                "visual_world_rules.era",
                "shot context outfit hint"
              ],
              "scenario_dependency_ban": "no work-specific proper nouns (character names, place names) — common nouns only",
              "regional_consistency": "한 작품 내 region 표기는 일관 — 선택된 세분 ethnicity (East Asian / Southeast Asian / South Asian / Caucasian / Black / Hispanic / Latina|o / Middle Eastern) 를 작품 단위 고정"
            },
            "constraints": [
              "visible real people with outfit binding use C##O## composite IDs",
              "do not use C##O## for a reproduced face inside a photograph, poster, painting, portrait, monitor, TV, mirror, window reflection, or projection — use a common noun + demographic descriptor instead",
              "do not use C##O## for isolated body-part focus (face or non-face) — when the framing is dominated by a single body part triggered by 'focus on / close on / tight on / detail on' phrasing, use a common noun (hand / eye / brow / jaw / etc.)",
              "for close-up of a face, do not use 'face filling the entire frame' / 'face filling nearly the entire frame' / 'her face fills the frame' / 'shoulders only entering the frame' / 'head snapped sideways' — keep upper body or shoulder edge visible in the frame ('tight framing on her face, upper body in frame')",
              "when introducing a C##O## (or C##) for the first time in this t2i_prompt, append a 1-2 token demographic descriptor (ethnicity + age band, or ethnicity + role hint) consistent with visual_world_rules.region — never use scenario-specific proper nouns",
              "use the format `C##O## in <옷 1-3 단어>, <demographic descriptor>` or `C##O##, <demographic descriptor>, <자세 표현>` — main characters with face refs may include this descriptor too (image inject takes precedence)"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "cb_deck_exterior_dusk_fog_wall",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cleat",
              "deck",
              "fishing rod rack",
              "fog",
              "hatch",
              "helm console",
              "net bin",
              "rail",
              "rope coil",
              "sea",
              "sliding door",
              "wheelhouse",
              "winch",
              "window"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "when focusing on an owned object, anchor it explicitly: 'the door from the reference'"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 28,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "body_part_cross_ref": "id_policy.body_part_focus_rule applies — when the focused sub-region is a body part, use a common noun + demographic descriptor (no C##/C##O##)",
                "rationale_summary": "zoom_in_detail = 앞 샷의 특정 영역을 확대한 '같은 사진'. 새 정보 추가 금지 — 현재 프레임이 보여주는 부분만 정확히 묘사"
              },
              "exact_background": {
                "scope_summary": "same room, possibly different moment or angle; background carries through, persons/actions are described fresh for this shot",
                "permitted_additions": [
                  "new persons, poses, expressions, actions for this shot's moment",
                  "different camera angle within the same room"
                ],
                "background_consistency_rule": "background elements established in the prior shot must remain consistent (no contradictory walls, doors, furniture)",
                "ignore_keep_handled_elsewhere": "ignore/keep directives are auto-applied via reference image processing — do not echo them inside t2i_prompt",
                "rationale_summary": "같은 공간, 새 순간 — 인물·동작은 이 샷의 instantaneous moment 로 묘사하되 배경은 prior shot 과 일관"
              },
              "atmosphere_reference": {
                "scope_summary": "different room/floor/angle entirely — only mood/tone is shared with the prior shot",
                "forbidden_imports": [
                  "furniture layout from the prior shot",
                  "wall positions from the prior shot",
                  "specific architectural features from the prior shot"
                ],
                "required_handling": "describe the new space's background directly in this shot; carry through only color tone or lighting mood (e.g. 'cool gray ambient' / 'dim warm pool')",
                "rationale_summary": "atmosphere_reference = 분위기 reference 만, 레이아웃 reference 아님. 가구·벽 배치를 끌어오면 모델이 두 공간을 한 공간으로 합성"
              }
            },
            "view_consistency": {
              "framing_scope_options": [
                "third_person",
                "close_up"
              ],
              "single_camera_rule": "one t2i_prompt = one camera position. do not combine a third-person full-body description and a close-up of the same character's body part.",
              "third_person_handling": "describe persons with full or partial body in frame; their hands/arms remain attached to their bodies (no isolated hand close-up alongside the full body)",
              "close_up_handling": "isolated body part (hand, wrist, fingers, brow) — do not include the same character's full body in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "the phrasing 'Focus on ...' specifies the area of focus while the camera position remains the same; it is NOT a view switch",
              "id_policy_cross_ref_for_body_part_focus": "id_policy.body_part_focus_rule applies — body-part Focus 시 C##O## 금지 (얼굴 ref 합성 차단)",
              "prop_orientation_rule": "props the character holds must face one direction only — toward camera OR toward character, not both. forbidden contradiction example: 'photo angled partly toward the camera' + 'eyes fixed on the photograph' (양방향 모순)",
              "mixing_forbidden": true,
              "rationale_summary": "single t2i_prompt = single camera shutter at 1/1000s. 시점 혼합은 모델이 두 카메라 합성으로 해석해 인물이 두 번 등장 또는 부위 분리"
            },
            "constraints": [
              "fixed_elements are continuity inputs derived from prior shots — treat them as binding context, not as source facts to be invented",
              "when fixed_elements[i].character_name maps to a C## in id_policy.allowed_base_entity_ids or a C##O## in id_policy.allowed_outlook_pairs, replace the common-noun person reference inside fixed_elements[i].description with that C##/C##O## and do not also write a separate common-noun reference for the same character in the same t2i_prompt",
              "previous_shot_refs with ref_usage='zoom_in_detail' must preserve the same moment, the same space, and the same lighting as the prior shot — no new persons, props, background elements, poses, or moments",
              "previous_shot_refs with ref_usage='exact_background' may freely describe this shot's persons, poses, and moment, but must keep background elements consistent with the prior shot's established room",
              "previous_shot_refs with ref_usage='atmosphere_reference' must describe a new space directly — do not import furniture layout or wall positions from the prior shot, only mood/tone",
              "one t2i_prompt = one camera position — do not combine a third-person full-body description and a close-up of the same character's body part; 'Focus on' specifies the area of focus, not a view switch (id_policy.body_part_focus_rule applies for any body-part Focus)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "cb_deck_exterior_dusk_fog_wall",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "_card_metadata": {
            "lift_status": {
              "rule_a_lifted": true,
              "rule_c_lifted": true,
              "rule_e_lifted": false,
              "rule_h_lifted": true,
              "id_policy_composite_lifted": true,
              "id_policy_close_framing_face_lifted": true,
              "id_policy_reproduction_surface_lifted": true,
              "continuity_cross_shot_id_substitution_lifted": true,
              "continuity_ref_usage_constraints_lifted": true,
              "continuity_view_consistency_lifted": true,
              "continuity_constraints_extended": true,
              "spatial_camera_frame_lifted": true,
              "spatial_fg_bg_shared_anchor_lifted": true,
              "spatial_primary_framing_lifted": true,
              "spatial_constraints_extended": true
            },
            "rule_source": {
              "camera_rule": "A",
              "owned_rule": "C",
              "close_skip_rule": "E",
              "demographic_rule": "H",
              "composite_id_rule": "C## 사용 규칙 — 참조 이미지 연동 (v17:32-64)",
              "close_framing_face_rule": "극단 클로즈업 표현 (v17:66-85)",
              "reproduction_surface_rule": "사진·포스터·화면·거울 속 인물 규칙 (v17:133-146)",
              "cross_shot_id_substitution_rule": "v20/scene_detail/system.md#continuity-section",
              "ref_usage_rule": "v20/scene_detail/system.md#continuity-section",
              "view_consistency_rule": "v20/scene_detail/system.md#continuity-section",
              "camera_frame_rule": "v20/scene_detail/system.md#spatial-consistency",
              "fg_bg_shared_anchor_rule": "v20/scene_detail/system.md#spatial-consistency",
              "primary_framing_rule": "v20/scene_detail/system.md#spatial-consistency"
            }
          }
        },
        "render_prompt_card_hash": "d183beff419a3d10"
      }
    ]
  },
  "step_id": "scene_detail",
  "run_id": "133743b0-f681-4f6a-b817-69abb96f89d6",
  "resolved_model": "gemini-pro",
  "updated_at": "2026-05-05T08:58:01.438455+00:00",
  "project_config_snapshot": {}
}