{
  "status": "completed",
  "completed_count": 63,
  "applicable_count": 63,
  "failed_count": 0,
  "schema_version": 7,
  "config_hash": "57553b5cf4c0f862",
  "data": {
    "scenes": [
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "공포에 질려 도망치는 남자의 얼굴",
        "representative_moment": "C06이 땀과 피가 맺힌 얼굴로 공포에 질려 숲속을 달리고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A tighter-than-stage CU at eye-level, tracking front-side with shallow DOF and cool dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. C06O08 in a dark outdoor jacket, a Korean adult figure, captured in a tight head-and-shoulder composition at eye-level, angled at three-quarter from the right. His upper body leans forward in a mid-stride freeze, short black hair whipping across the left edge of his sweat-slick face in the direction opposite to his motion. His dark eyes are fixed on the distant shadows. Low-key dusk light from above washes his skin with a cool tone, while faint highlights catch small red-brown traces of blood and sweat on his cheek and neck. Sharp focus on his panicked expression. [L01: frame-edge wet dark green foliage brushing near the shoulder, compressed dark tree trunks smearing in shallow depth of field behind him, thin backlit dusk mist at the borders].",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "Scene text: '잔뜩 겁에 질린 남자 표정'",
              "Shot 2 description: 'sweat-slick face occupies roughly 75% of the frame', 'windblown hair whipping across the left edge'"
            ],
            "visual_inferences": [
              "head-and-shoulder composition applied to avoid a floating disconnected head in close framing",
              "running motion captured via a mid-stride freeze with leaning shoulder and hair flowing opposite to movement"
            ],
            "creative_decisions": [
              "shallow depth of field creating a smearing effect on the background trunks to emphasize speed and isolation",
              "cool dusk lighting on the skin contrasting with the red-brown traces of blood to heighten tension"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "ddbbcd5d82b17b67",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d0186e8fc8a296f5",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "None",
        "_shot_index": 2,
        "visible_entities": [
          "C06",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A tighter-than-stage CU at eye-level, held in a tracking front-side position about half a meter from 남자’s face as the camera moves backward and slightly sideways through the trees. His sweat-slick face occupies roughly 75% of the frame, with windblown hair whipping across the left edge and compressed trunks smearing behind him in shallow DOF, making the running motion tremble at the margins.",
            "lighting_mood": "Low-key dusk light filters through wet foliage, cooling the skin tones while small red-brown traces of blood and sweat catch the last light.",
            "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": [
              "C06",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "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": 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_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, dark forest setting at dusk, characterized by wet, dark green foliage and muddy ground covered with crushed leaves. The atmosphere is consistently illuminated by low-key, fading natural light filtering through the dense canopy, creating deep shadows.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "source_facts": [
                  "Scene text: '숲속 / 해 질 무렵'",
                  "Shot 2: 'Low-key dusk light filters through wet foliage'",
                  "Shot 4: 'muddy green-black with fading dusk highlights', 'crushed leaves'"
                ],
                "visual_inferences": [
                  "The ground remains persistently muddy and damp across the scene, matching the wet foliage and suspended dust"
                ],
                "creative_decisions": [
                  "Anchoring the visual continuity across vastly different framings by maintaining a cohesive low-key dusk lighting profile and wet forest textures in the background"
                ],
                "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": "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": "fa2ba9f5faef47ad"
      },
      {
        "scene_index": 1,
        "heading": "S#1. 숲속 / 해 질 무렵",
        "beat_title": "검은 인영의 기습과 남자의 제압",
        "representative_moment": "C12가 C06을 수풀 바닥으로 거칠게 짓누르며 흙먼지가 허공에 흩뿌려지는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A ground-level medium shot with a low angle, capturing the impact through suspended dust with a muddy green-black palette.",
            "t2i_prompt": "Photorealistic cinematic still. A ground-level medium shot with a low angle and slightly canted frame. In the midground, sharing the muddy ground covered with crushed leaves, C12O00, a black humanoid silhouette with no visible facial features, is shown with back to camera, crouching heavily over the torso of C06O08, exerting forceful downward weight. C12O00's body volume is preserved against the dim ambient fill with faint rim light tracing the shoulders. C06O08 in hiking outerwear, a Korean adult male with short black hair and dark eyes, appears in left profile, pinned forcefully back into the wet ground, looking down. Freshly kicked-up dust and broken grass stems drift across the foreground, briefly veiling the entangled figures. Focus on the forceful pinning contact and the suspended dust in the air. The background is a dense, dark forest setting at dusk, characterized by wet, dark green foliage and dark tree trunks hidden by mist. The lighting casts a muddy green-black palette with fading dusk highlights catching the wet ground and suspended dust, establishing a suffocating occult weight.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              },
              {
                "character_id": "C12",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "Scene text: '검은 인영이 남자를 덮친다.'",
              "Shot description: 검은 인영의 무게에 짓눌려 수풀 바닥으로 고꾸라진 남자, 흙먼지가 허공에 흩뿌려진 순간.",
              "Camera setting: A ground-level MWS with a low angle, the handheld camera settled almost on the forest floor less than a meter from the collapsed bodies."
            ],
            "visual_inferences": [
              "fixed_element dusk_forest_environment: wet, dark green foliage, muddy ground, crushed leaves, low-key fading dusk light.",
              "C12 trait carryover: black humanoid silhouette with no visible facial features.",
              "C06 trait carryover: short black hair, dark eyes.",
              "Impact implies freshly kicked-up dust and bent grass stems creating a natural foreground obscuration."
            ],
            "creative_decisions": [
              "Utilized a slightly canted ground-level perspective to emphasize the sudden, forceful physical impact of the ambush.",
              "Employed faint rim light to maintain C12's body volume without violating the 'face fully obscured' trait, preventing a flat cutout appearance.",
              "Applied a muddy green-black color palette to heighten the occult and suffocating horror atmosphere specified by the beat."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e04346fc87b3be16",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d36e3787385d3448",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "Shot 2 (exact_background) establishes the dark forest environment and low-key dusk lighting which are preserved here.",
        "_shot_index": 4,
        "visible_entities": [
          "C06",
          "C12",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A ground-level MWS with a low angle, the handheld camera settled almost on the forest floor less than a meter from the collapsed bodies. Dust and crushed leaves drift across the foreground, briefly veiling 남자 and 검은 인영 tangled in the midground before focus breathes back onto their forms; the frame is slightly canted from the impact but remains derived from the fall path.",
            "lighting_mood": "The palette is muddy green-black with fading dusk highlights cutting through suspended dust, giving the collapse a suffocating occult weight.",
            "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": [
              "C06",
              "C12",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              },
              {
                "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": "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_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense, dark forest setting at dusk, characterized by wet, dark green foliage and muddy ground covered with crushed leaves. The atmosphere is consistently illuminated by low-key, fading natural light filtering through the dense canopy, creating deep shadows.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "source_facts": [
                  "Scene text: '숲속 / 해 질 무렵'",
                  "Shot 2: 'Low-key dusk light filters through wet foliage'",
                  "Shot 4: 'muddy green-black with fading dusk highlights', 'crushed leaves'"
                ],
                "visual_inferences": [
                  "The ground remains persistently muddy and damp across the scene, matching the wet foliage and suspended dust"
                ],
                "creative_decisions": [
                  "Anchoring the visual continuity across vastly different framings by maintaining a cohesive low-key dusk lighting profile and wet forest textures in the background"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "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": "C06O08",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C12O00",
                "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": "2b92938ce4d7045f"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "가로등 불빛 아래 섬뜩한 포옹과 공격",
        "representative_moment": "어두운 뒷골목 전봇대 아래서 C10이 쓰러져가는 C09를 강하게 지탱한 채 목덜미를 파고드는 섬뜩한 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A locked-off wide composition at eye-level, isolating the central figures in a pool of yellow-green light amidst heavy black shadows",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level composition from the mouth of a damp, dark narrow urban alleyway. In the center, C10O11 in dark clothes, an East Asian adult male with black hair, a pale face, and red eyes, stands at a three-quarter angle from the left. He is the one driving the action, forcefully bracing C09O10 against a weathered concrete utility pole, his face hovering right over her exposed neck, his red eyes fixed on her. C09O10 in a night-out dress, an East Asian adult female with dark long hair, stands at a three-quarter angle from the right as the constrained figure, her knees buckling downward, her slack body line slanting toward the wet asphalt, looking down. The full-body figures are isolated within a thin pool of weak, sickly yellow-green light cast by a streetlamp in the upper frame. The illumination highlights the slick, dark surface of the ground below their shoes and the dirty concrete walls closing in on both sides, leaving the rest of the alley in deep black shadow. Focus on the heavy physical hold and the stark red color accent of the man's eyes against the green ambient dampness.",
            "outfit_assignments": [
              {
                "character_id": "C10",
                "outlook_id": "O11"
              },
              {
                "character_id": "C09",
                "outlook_id": "O10"
              }
            ],
            "source_facts": [
              "S#2. 도심 희미한 가로등 불빛. 전봇대에 뒤엉켜있는 두 사람.",
              "남자의 붉은 눈동자, 목의 살점을 뜯는 이빨... 푹 힘없이 쓰러지는 여자."
            ],
            "visual_inferences": [
              "fixed_element dim_alley_environment: weak yellow-green streetlamp, damp walls, wet asphalt.",
              "C10 forcefully bracing C09 against the utility pole, establishing physical power imbalance.",
              "C09's knees buckling, creating a slanting body line toward the ground."
            ],
            "creative_decisions": [
              "Eye-level full-body framing to capture both characters' postures and the scale of the dark alleyway walls.",
              "Positioned C10's face clearly over C09's exposed neck to anchor the upcoming forward zoom target.",
              "Red eyes explicitly described as the sole color accent against the sickly yellow-green light."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "1dabcf7540176615",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "7bdbd7c842fd3e31",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "C10",
          "C09",
          "L02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A locked-off WS at eye-level from the mouth of the narrow alley, about seven meters from the utility pole, facing straight into the weak streetlamp pool. 붉은 눈동자 남자 and 여자 are held full-body near center, small against damp walls, with her body line slanting downward as her knees give way while he braces her against the pole.",
            "lighting_mood": "A thin yellow-green streetlamp isolates the pair in a damp black alley, with the man’s red eyes as the only saturated color 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",
              "C09",
              "L02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C10",
                "outlook_id": "O11"
              },
              {
                "character_id": "C09",
                "outlook_id": "O10"
              }
            ],
            "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": "dim_alley_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A damp, dark narrow urban alleyway illuminated by a single, weak, sickly yellow-green streetlamp. A weathered concrete utility pole stands near the light source. The dim lighting highlights the wet, dark textures of the surrounding walls, leaving the rest of the scene in deep black shadow.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "source_facts": [
                  "S#2. 도시 뒷골목 / N",
                  "도심 희미한 가로등 불빛. 전봇대에 뒤엉켜있는 두 사람.",
                  "A thin yellow-green streetlamp isolates the pair in a damp black alley",
                  "Sickly low-key streetlight"
                ],
                "visual_inferences": [
                  "The alley walls and ground are wet or damp, reflecting the sickly yellow-green light to emphasize the grim setting."
                ],
                "creative_decisions": [
                  "Focused on the harsh contrast between the isolated pool of yellow-green light and the enveloping deep shadows to anchor the eerie atmosphere across both wide and close-up framings."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [
              {
                "scene_index": 2,
                "shot_index": 3,
                "description": "붉은 눈동자 남자의 이빨이 여자의 목덜미 피부에 깊게 박힌 채 멈춘 찰나의 클로즈업.",
                "keep_elements": [
                  "the same man in dark clothes with red eyes",
                  "the same woman in a night-out dress",
                  "the weathered concrete utility pole",
                  "the damp, narrow alleyway",
                  "the weak yellow-green streetlight glow",
                  "the wet asphalt"
                ]
              }
            ],
            "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": "C10O11",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C09O10",
                "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": "9c3e891c6dbb8764"
      },
      {
        "scene_index": 2,
        "heading": "S#2. 도시 뒷골목 / N",
        "beat_title": "목을 물어뜯는 순간",
        "representative_moment": "C10O11의 이빨이 C09O10의 목덜미 피부에 깊게 박힌 채 멈춘 클로즈업 정지 컷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Dutch angle ECU at shoulder height with shallow depth of field, sickly yellow-green low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. A Dutch angle, head-and-shoulder composition at shoulder height. C10O11 in a dark jacket, a Korean adult male showing variant features carried from stable_traits — pale skin and red eyes — is the figure exerting force, positioned in right profile, upper chest in frame. His jaw is clamped forward, eyes fixed on C09O10. The same figure from the previous shot, C09O10 in a dark coat, a Korean adult female with dark long hair, the figure receiving the force, is partially visible at the lower right edge in left profile, looking away, head sagging sideways, with eyes closed. His teeth apply firm, decisive contact to her exposed neck. The sharp focal point is this intense teeth-to-skin connection sitting just off center in the lower right. [L02: A rough, damp, dark stained side surface of the same weathered concrete utility pole forms a hard vertical edge beside their faces. The background is compressed into wet, nearly black indistinct darkness with a tiny diffused yellow-green streetlamp bokeh above and behind.] Sickly low-key yellow-green light grazes his cheek, jawbone, and the wet concrete texture. A deep red glint catches in his eye, contrasting against the enveloping black shadow.",
            "outfit_assignments": [
              {
                "character_id": "C10",
                "outlook_id": "O11"
              },
              {
                "character_id": "C09",
                "outlook_id": "O10"
              }
            ],
            "source_facts": [
              "S#2. 도심 희미한 가로등 불빛. 전봇대에 뒤엉켜있는 두 사람.",
              "남자의 붉은 눈동자, 목의 살점을 뜯는 이빨… 푹 힘없이 쓰러지는 여자.",
              "shot description: 붉은 눈동자 남자의 이빨이 여자의 목덜미 피부에 깊게 박힌 채 멈춘 찰나의 클로즈업."
            ],
            "visual_inferences": [
              "fixed_element dim_alley_environment: A damp, dark narrow urban alleyway illuminated by a single, weak, sickly yellow-green streetlamp.",
              "C10 acts as the figure exerting force in right profile, while C09 is the constrained figure held in place with her head sagging.",
              "The teeth-to-skin contact is positioned just off center in the lower right for an ECU composition."
            ],
            "creative_decisions": [
              "Dutch angle at shoulder height with shallow depth of field to emphasize the eerie, diseased stillness of the moment.",
              "The weathered utility pole surface is used as a hard vertical frame-edge to anchor the close framing while skipping the wider background reference.",
              "Sickly low-key yellow-green light grazes the skin, creating a stark contrast with the deep red glint in the eye and the black background."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "8ff478ded74a8842",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "72faaeff049949e1",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 2,
        "dependency_reason": "zoom_in_detail from the previous shot (same space and lighting, focusing on the specific characters and interaction at the pole)",
        "_shot_index": 3,
        "visible_entities": [
          "C10",
          "C09",
          "L02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "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 ECU with a Dutch angle at shoulder height beside the utility pole, only about thirty centimeters from 여자’s neck, angled tightly across 붉은 눈동자 남자’s cheek and jawline. The teeth-to-skin contact sits just off center in the lower right, while most of the alley is excluded; shallow DOF holds the instant like a diseased still photograph rather than an action beat.",
            "lighting_mood": "Sickly low-key streetlight grazes skin and jawbone, while a deep red glint in the eye punctures the otherwise muted black-green frame.",
            "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",
              "C09",
              "L02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C10",
                "outlook_id": "O11"
              },
              {
                "character_id": "C09",
                "outlook_id": "O10"
              }
            ],
            "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": "dim_alley_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A damp, dark narrow urban alleyway illuminated by a single, weak, sickly yellow-green streetlamp. A weathered concrete utility pole stands near the light source. The dim lighting highlights the wet, dark textures of the surrounding walls, leaving the rest of the scene in deep black shadow.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "source_facts": [
                  "S#2. 도시 뒷골목 / N",
                  "도심 희미한 가로등 불빛. 전봇대에 뒤엉켜있는 두 사람.",
                  "A thin yellow-green streetlamp isolates the pair in a damp black alley",
                  "Sickly low-key streetlight"
                ],
                "visual_inferences": [
                  "The alley walls and ground are wet or damp, reflecting the sickly yellow-green light to emphasize the grim setting."
                ],
                "creative_decisions": [
                  "Focused on the harsh contrast between the isolated pool of yellow-green light and the enveloping deep shadows to anchor the eerie atmosphere across both wide and close-up framings."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 2,
                "shot_index": 1,
                "ref_usage": "zoom_in_detail",
                "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": "C10O11",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C09O10",
                "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": "8a063f1a01cb1ce9"
      },
      {
        "scene_index": 3,
        "heading": "S#3. 현장 / D",
        "beat_title": "현장 감식과 혜수의 수사 지휘",
        "representative_moment": "감식 현장 한가운데서 미간을 찌푸린 채 특정 지점을 매섭게 응시하는 C02의 상반신.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height framing with a slight low angle, desaturated flat daylight with news-camera compression effect.",
            "t2i_prompt": "Photorealistic cinematic still. Chest-height framing looking slightly upward at the figure, the upper body occupying the center-right of the frame. C02O03 in a dark jacket, a Korean middle-aged woman with black hair and mature facial lines. Her shoulders are squared and tense, face turned at a three-quarter left angle, her distinct eyes fixed sharply toward an evidence marker implied just outside the left frame edge. Focus on her intense expression and the tension in her neck and shoulders. The scene is lit by flat daylight desaturated by news-camera compression, casting clinical gray-blue shadows. [L03: taut yellow police line tape stretched diagonally across the soft, out-of-focus background, with a blurred white forensic tarp and damp ground texture].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#3 action: '현장을 감식하는 경찰, 폴리스 라인을 치고 시신을 수거한다. 형사무리 속에 사건을 지휘하는 혜수의 모습이 보인다.'",
              "shot description: 혜수(C02)가 감식 현장 한가운데 선 채 미간을 찌푸리고 특정 지점을 매섭게 응시하는 상체."
            ],
            "visual_inferences": [
              "news-camera compression texture applied to reflect the '지역 뉴스 화면' context without rendering actual UI borders",
              "soft background blurring of the forensic scene (L03) to adhere to close framing constraints while providing context"
            ],
            "creative_decisions": [
              "placed C02 at center-right of the frame to provide natural looking-room toward the off-camera evidence marker",
              "desaturated flat daylight with gray-blue shadows chosen to emphasize the dark, clinical, and uneasy tone of the occult thriller genre"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "7552737ba587a23f",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "7f2e1ccdbcebdf4c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "독립적인 시점의 뉴스 화면 연출 씬으로 직접적인 이전 샷의 연속성 제약 없음.",
        "_shot_index": 2,
        "visible_entities": [
          "C02",
          "L03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A broadcast-like MCU from a chest-height, slightly off-center position about 1.5 meters in front of 혜수, finishing a restrained dolly-in with a slight low angle. 혜수 occupies the center-right of frame, shoulders tense and face turned three-quarters toward an evidence point just outside the left edge, while police activity remains softened behind her as televised background noise.",
            "lighting_mood": "Flat daylight is desaturated by news-camera compression, with gray-blue shadows and damp ground texture keeping the scene clinical but 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": [
              "C02",
              "L03"
            ],
            "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": "436b272e0613281d"
      },
      {
        "scene_index": 4,
        "heading": "S#4. 옥탑방 / D",
        "beat_title": "불안과 긴장 속의 적막한 옥탑방 풍경",
        "representative_moment": "햇빛이 비치는 낡은 빌라 옥상과 빈 평상을 차갑게 내려다보는 부감 풍경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "overhead bird's eye view, pale daytime sun, muted beige-gray tones",
            "t2i_prompt": "Photorealistic cinematic still. Overhead bird's eye view looking straight down from high above the aging villa rooftop. Focus on the empty 평상 (pyeongsang), a low wooden platform, from the reference sitting slightly off-center within the roof rectangle. Pale daytime sun washes the rooftop deck from the reference in muted beige-gray tones, giving the ordinary space a cold, watched quality. The sun-bleached parapet wall from the reference, a faded water tank from the reference, and a stairwell bulkhead from the reference sit rigidly under the stark light. The geometry is entirely devoid of people, framed by quiet, cramped neighboring rooftops at the edges.",
            "outfit_assignments": [],
            "source_facts": [
              "S#4. 옥탑방 / D",
              "인천 변두리 부감, 오래된 빌라 옥탑방 전경."
            ],
            "visual_inferences": [
              "empty wooden platform emphasizing absence and stillness",
              "pale muted tones conveying a cold, watched feeling despite daytime"
            ],
            "creative_decisions": [
              "overhead bird's eye view framing to make the rooftop look isolated and exposed",
              "explicit anchoring of owned objects like the platform, water tank, and parapet to the background reference"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "44d256583eb76dab",
              "owned_hash": "9cc93746643fe6bd",
              "camera_direction_hash": "5e57252bfd3c4bde",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "platform",
                  "violating_phrase": "the empty wooden platform from the reference",
                  "reason": "The phrase explicitly references the existing platform from the reference rather than asking to create or add a new one.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "parapet",
                  "violating_phrase": "The sun-bleached parapet wall from the reference",
                  "reason": "The parapet is described as an existing reference object, not newly drawn or modified.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stairwell bulkhead",
                  "violating_phrase": "a stairwell bulkhead from the reference",
                  "reason": "The bulkhead is only mentioned as part of the referenced scene and is not targeted by a redraw verb.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "water tank",
                  "violating_phrase": "a faded water tank from the reference",
                  "reason": "The water tank is referenced as an existing background element, so this is an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "none",
        "_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": "A static EWS in overhead / bird's eye view from roughly 25 meters above the aging villa rooftop, looking straight down without beginning the later crane withdrawal. The wooden platform sits slightly off center within the roof rectangle, surrounded by parapet walls, water stains, and cramped neighboring rooftops that make the sunlit space feel exposed rather than safe.",
            "lighting_mood": "Pale daytime sun washes the rooftop in muted beige-gray tones, but the rigid overhead stillness gives the ordinary space a cold, watched quality.",
            "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": "cb_rooftop_day_normal",
            "reference_usage": "exact_background",
            "owned_objects": [
              "clothesline",
              "door",
              "drain",
              "light",
              "parapet",
              "pipe",
              "platform",
              "post",
              "rooftop deck",
              "stairwell bulkhead",
              "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": [],
            "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": "cb_rooftop_day_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": "62d381b4d3435252"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "연쇄 살인 뉴스를 굳은 표정으로 시청하는 민숙",
        "representative_moment": "민숙이 거실 중앙에 서서 앞치마를 꽉 쥔 채, 굳은 표정으로 카메라 너머의 TV를 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A static eye-level medium shot framing the subject frontally, mixing thin sunlight and cold TV spill for a low-key, tense mood",
            "t2i_prompt": "Photorealistic cinematic still. A static eye-level medium shot. C04O05 in an apron over casual clothes, a middle-aged Korean woman with black hair, gentle facial lines, and dark eyes, stands occupying the central vertical axis of the room, facing the camera. Her hands tightly grip the fabric of the apron, and her gaze is locked slightly past the camera lens toward an unseen television screen. Focus on her fixed, stiff expression. Thin daylight from the existing sliding window from the reference behind her mixes with a cold TV light spill, leaving her face low-key and gray, turning the faint domestic warmth sour. The existing aged living-room wall and the rear edge of the sink area from the reference sit softly in the background.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "S#5 action: '앞치마를 두른 채 TV 뉴스를 뚫어지게 바라보는 민숙 표정이 어둡다.'",
              "shot description: Minsuk stands in the center, facing the camera, staring blankly at the TV monitor with a dark expression.",
              "DP instruction: apron gripped tight, eyes fixed on the television (off camera)"
            ],
            "visual_inferences": [
              "Minsuk's grip on the apron reflects her hidden tension",
              "television is positioned just off-camera near the lens line, casting cold light onto her face",
              "the background elements (window, sink area, wall) are softly out of focus behind her"
            ],
            "creative_decisions": [
              "medium shot at eye-level to capture both her upper body tension and facial expression",
              "mixed lighting (cool TV spill vs thin daylight) to visually depict the domestic warmth turning sour"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "12dc85c8174fb125",
              "owned_hash": "660e140836e49bf2",
              "camera_direction_hash": "6bcdb7fef9361f3b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "TV",
                  "violating_phrase": "unseen television screen",
                  "reason": "The prompt mentions TV only as an unseen reference target and does not directly instruct creating or modifying a TV object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sliding window",
                  "violating_phrase": "existing sliding window from the reference",
                  "reason": "The phrase explicitly anchors the sliding window to the reference as an already-existing background element, not a new addition.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sink",
                  "violating_phrase": "the rear edge of the sink area from the reference",
                  "reason": "The sink is mentioned as part of the existing reference background, which is an anchoring description rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on prior shots",
        "_shot_index": 2,
        "visible_entities": [
          "C04",
          "P02",
          "P10",
          "P01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static MS at eye-level from about 2.5 meters in front of 민숙, framing her frontally in the living room while the television remains just off camera near the lens line. She occupies the central vertical axis in her apron, gaze locked slightly past camera toward the unseen screen, with the kitchen foreground excluded so her fixed expression becomes the only active element.",
            "lighting_mood": "Thin window sunlight mixes with cold TV spill, leaving 민숙’s face low-key and gray with a faint domestic warmth turning sour.",
            "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": [
              "C04",
              "P02",
              "P10",
              "P01",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "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": "cb_living_day_herb_tea_news",
            "reference_usage": "exact_background",
            "owned_objects": [
              "AC",
              "TV",
              "TV console",
              "cooktop",
              "curtain",
              "document",
              "door",
              "floor cushion",
              "kitchen counter",
              "mug",
              "photograph",
              "refrigerator",
              "shoe rack",
              "sink",
              "sliding window",
              "sofa",
              "table"
            ],
            "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": "C04O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "cb_living_day_herb_tea_news",
                "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": "f51e95784ecb279b"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "수리영이 엄마의 손목 표식을 인지하는 순간",
        "representative_moment": "수리영 앞 식탁에 민숙이 찻잔을 내려놓을 때 그녀의 손목에 있는 붉은 표식이 선명하게 드러난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A table-height CU with a low angle, muted gray mood with a warm daylight beam catching the steam.",
            "t2i_prompt": "Photorealistic cinematic still. A table-height CU with a low angle, tight on the lower forearm and inner wrist of an East Asian middle-aged woman. Wearing a blurred sleeve and apron, she reaches in from the left to place a steaming teacup in the lower center of the shared table. A small, sharply defined red circular mark is distinctly visible on the skin of her inner wrist, exposed past the edge of the sleeve. Warm steam curls upward from the herbal drink, catching a narrow beam of daylight. In the right foreground, the blurred over-the-shoulder silhouette of a young East Asian woman in a casual indoor outfit is perched at the table edge with back to camera, her posture indicating her unseen eyes fixed on the cup. [L05: worn, slightly sticky dining table top receding into a muted gray soft focus]. The lighting makes the ordinary cup feel faintly medicinal and ominous.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: 힐끗, 민숙 손목에 보이는 작은 원(이하 표식)을 본다.",
              "Scene text: 오늘따라 유난히 또렷해 보이지만",
              "Shot 5 camera: 민숙’s forearm crossing in from the left.",
              "Shot 7 camera: pushed within thirty centimeters of 민숙’s inner wrist... small circular mark fill most of the frame"
            ],
            "visual_inferences": [
              "fixed_element minsuk_wrist_mark_detail: A small, sharply defined red circular mark is distinctly visible on the skin of the inner wrist.",
              "The sleeve is slightly pulled back to naturally expose the inner wrist during the arm movement of placing the cup."
            ],
            "creative_decisions": [
              "Triggered body_part_focus_rule ('tight on the lower forearm') to prevent T2I models from stitching floating faces into a hand close-up, substituting C## IDs with common nouns + demographic descriptors.",
              "Used shallow depth of field and skipped room background entirely [L05] to maintain strict adherence to skipped_close_framing policy.",
              "Placed Su-ri-young as a blurred foreground shoulder silhouette to anchor the spatial relationship on the shared table while keeping sharp focus on Min-suk's wrist."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d460252482c45541",
              "owned_hash": "660e140836e49bf2",
              "camera_direction_hash": "703c4d8e0c4249cd",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "같은 옥탑방 공간의 연속 상황이나, 클로즈업 프레이밍 정책(skipped_close_framing)에 따라 배경 참조 이미지는 직접 사용되지 않고 피사체와 근접 표면에만 집중함.",
        "_shot_index": 5,
        "visible_entities": [
          "C04",
          "C01",
          "P02",
          "P10",
          "P01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A table-height CU with a low angle beside 수리영’s seat, dollying slightly toward the cup as 민숙’s hand enters from the kitchen side. The herbal drink lands in the lower center and occupies less than a quarter of the frame, steam curling upward between 수리영’s blurred shoulder at right foreground and 민숙’s forearm crossing in from the left.",
            "lighting_mood": "Warm steam catches the narrow daylight while the rest of the room stays muted and gray, making the ordinary cup feel faintly medicinal and 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": [
              "C04",
              "C01",
              "P02",
              "P10",
              "P01",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              },
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "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": "cb_living_day_herb_tea_news",
            "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": "minsuk_wrist_mark_detail",
                "element_type": "character_state",
                "character_name": "민숙",
                "description": "A close-up detail view of an East Asian woman's lower forearm and inner wrist. A small, sharply defined red circular mark is distinctly visible on the skin of the inner wrist. The wrist area is exposed past the edge of a sleeve.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "source_facts": [
                  "Scene text: 힐끗, 민숙 손목에 보이는 작은 원(이하 표식)을 본다.",
                  "Scene text: 오늘따라 유난히 또렷해 보이지만",
                  "Shot 5 camera: 민숙’s forearm crossing in from the left.",
                  "Shot 7 camera: pushed within thirty centimeters of 민숙’s inner wrist... small circular mark fill most of the frame"
                ],
                "visual_inferences": [
                  "The sleeve is either short or slightly pulled back to naturally expose the inner wrist and the mark during arm movements."
                ],
                "creative_decisions": [
                  "Framing class 'zoom/detail' is applied to anchor the physical appearance of the distinct mark on the skin without detailing the entire body, ensuring consistency across close-ups."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [
              {
                "scene_index": 5,
                "shot_index": 7,
                "description": "민숙의 손목 안쪽에 새겨진 선명하고 작은 원형 표식 클로즈업.",
                "keep_elements": [
                  "the same wrist and forearm",
                  "the red circular mark on the inner wrist",
                  "the sleeve edge",
                  "the blurred apron edge",
                  "the same skin texture and lighting"
                ]
              }
            ],
            "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": "C04O05",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "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": "ee2132c6ed1de2c6"
      },
      {
        "scene_index": 5,
        "heading": "S#5. 옥탑방 안 / 실내",
        "beat_title": "수리영이 엄마의 손목에 있는 유난히 또렷한 표식을 인지하는 상태",
        "representative_moment": "민숙 손목에 보이는 작은 원형 표식이 뚜렷하게 보인다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Subjective POV extreme close-up from chest height, slight high angle, low-key interior with a strip of daylight",
            "t2i_prompt": "Photorealistic cinematic still. A subjective POV extreme close-up at a slight high angle, focus on the exposed inner wrist of a Korean middle-aged woman. The wrist is turned outward. A small, sharply defined red circular mark is distinctly visible on the skin, filling most of the frame but leaving room around it. The sleeve edge and blurred muted apron fabric provide scale at the periphery. A thin strip of daylight grazes the wrist against the dark room, making the small red circle appear unnaturally crisp without overt supernatural glow. The background is compressed into [L05: soft shadow of a dim beige-gray entryway wall].",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: 힐끗, 민숙 손목에 보이는 작은 원(이하 표식)을 본다.",
              "Scene text: 오늘따라 유난히 또렷해 보이지만"
            ],
            "visual_inferences": [
              "fixed_element minsuk_wrist_mark_detail: A close-up detail view of an East Asian woman's lower forearm and inner wrist. A small, sharply defined red circular mark is distinctly visible on the skin",
              "The sleeve is slightly pulled back to naturally expose the inner wrist"
            ],
            "creative_decisions": [
              "ECU framing from subjective POV at chest height to emphasize the sudden realization of the mark",
              "A thin strip of daylight against low-key interior to make the mark pop visually",
              "Body-part focus applies, replacing character ID with a common noun and demographic descriptor"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e2b536bd055c3187",
              "owned_hash": "660e140836e49bf2",
              "camera_direction_hash": "6f0f2a037fce5d43",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "Same scene, zoom_in_detail from previous shot (Shot 5) to preserve the exact physical appearance of the wrist mark.",
        "_shot_index": 7,
        "visible_entities": [
          "C04",
          "P02",
          "P10",
          "P01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A subjective POV ECU from 수리영’s side at chest height, pushed within thirty centimeters of 민숙’s inner wrist at a slight high angle. The wrist and small circular mark fill most of the frame but not the whole image, with sleeve edge and apron blur providing scale while the surrounding entryway is minimized into soft shadow.",
            "lighting_mood": "A thin strip of daylight grazes the wrist against a low-key interior, making the small circle appear unnaturally crisp without overt supernatural 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": [
              "C04",
              "P02",
              "P10",
              "P01",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "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": "cb_living_day_herb_tea_news",
            "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": "minsuk_wrist_mark_detail",
                "element_type": "character_state",
                "character_name": "민숙",
                "description": "A close-up detail view of an East Asian woman's lower forearm and inner wrist. A small, sharply defined red circular mark is distinctly visible on the skin of the inner wrist. The wrist area is exposed past the edge of a sleeve.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "source_facts": [
                  "Scene text: 힐끗, 민숙 손목에 보이는 작은 원(이하 표식)을 본다.",
                  "Scene text: 오늘따라 유난히 또렷해 보이지만",
                  "Shot 5 camera: 민숙’s forearm crossing in from the left.",
                  "Shot 7 camera: pushed within thirty centimeters of 민숙’s inner wrist... small circular mark fill most of the frame"
                ],
                "visual_inferences": [
                  "The sleeve is either short or slightly pulled back to naturally expose the inner wrist and the mark during arm movements."
                ],
                "creative_decisions": [
                  "Framing class 'zoom/detail' is applied to anchor the physical appearance of the distinct mark on the skin without detailing the entire body, ensuring consistency across close-ups."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 5,
                "ref_usage": "zoom_in_detail",
                "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": "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": "473d3a5380f0203b"
      },
      {
        "scene_index": 6,
        "heading": "해안가 도로 / D",
        "beat_title": "개 짖는 소리에 홱 꺾이는 고개",
        "representative_moment": "이어폰을 끼고 자전거를 타던 C01이 옆에서 들려오는 개 짖는 소리에 고개를 홱 꺾는다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A moving CU at eye-level from a tight side-front position alongside the bicycle, panning to keep the cycling motion alive with desaturated coastal daylight.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level composition from a tight side-front position alongside a bicycle. C01O02 in a zippered activewear jacket, a Korean young woman with a soft facial structure and dark eyes, upper body in frame at a three-quarter angle from the right in a side-front riding pose. Her head is snapped sideways, her eyes cutting toward frame left, reacting to a sudden noise. Her long black hair streams backward opposite to the forward cycling motion. A white earphone is visible in her ear. A sliver of the bicycle handlebar is blurred at the lower frame edge to convey speed. [L06: Bright coastal daylight desaturated by sea haze casts cool blue-gray tones over the scene, with a sunlit gray coastal road streaking past a weathered metal guardrail, and a bright hazy blue-gray sea horizon in the distance].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#6. 해안가 도로: 수리영 자전거를 타고 해안가 도로를 달린다. 컹! 컹! (개 짖는 소리)",
              "shot description: 귀에 이어폰을 꽂은 수리영의 고개가 개 짖는 소리가 난 방향으로 꺾인 찰나의 표정",
              "stable_traits: C01 (수리영) is a Korean young woman, long black hair, soft facial structure, dark eyes"
            ],
            "visual_inferences": [
              "side-front riding pose preserved for forward continuity",
              "long black hair streaming backward to indicate forward motion against the freeze-frame",
              "blurred handlebar at the lower edge to show speed"
            ],
            "creative_decisions": [
              "tight head-and-shoulder framing to emphasize the sudden head snap without violating close-framing body separation limits",
              "cool blue-gray tones and desaturated lighting to undercut the initially lively mood and hint at mystery"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a00b1cbac8a9e1c8",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "25654e585875eaf7",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "none",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L06"
        ],
        "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": "A moving CU at eye-level from a tight side-front position alongside 수리영’s bicycle, panning with her as her head snaps toward the offscreen bark. The earphone side of her face is framed slightly tighter, her eyes cutting toward frame left while a sliver of handlebar and the coastal road streak through the lower edge to keep the cycling motion alive.",
            "lighting_mood": "Bright coastal daylight is desaturated by sea haze, with soft wind and cool blue-gray tones undercutting her initially lively mood.",
            "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",
              "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": 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": [
              {
                "scene_index": 9,
                "shot_index": 2,
                "description": "페달에 체중을 싣고 상체를 앞으로 숙인 수리영의 창백하고 굳은 얼굴.",
                "keep_elements": [
                  "the same young woman on the bicycle",
                  "the same side-front riding pose",
                  "the blurred bicycle handlebar at the lower edge",
                  "the coastal road and sea horizon in the background",
                  "the long black hair streaming backward"
                ]
              }
            ],
            "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": "ec28fe2700357fd3"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "맹견을 눈빛으로 제압하는 수리영",
        "representative_moment": "C01이 몸을 숙여 철창 너머의 C07과 강렬하게 시선을 교환하며 기세를 꺾는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle intense CU at animal eye height, shallow depth of field, low-key greenish fluorescent daylight with cold damp shadows.",
            "t2i_prompt": "Photorealistic cinematic still. Low angle from a low observer position at animal eye height, head-and-shoulder composition. C01O02 in a dark work jacket, a young Korean woman with long black hair and soft facial contours, bending down toward the cage in three-quarter left profile. Her face occupies the center-right of the upper frame, with her shoulder edge visible. Her distinctive dark eyes are sharply focused, eyes fixed downward. In the extreme lower left foreground, C07O00, a large dog with short dark brown fur, a broad head, and a strong jaw, is framed over-the-shoulder; its tense planted paws and dark eye-line sit as a smeared foreground edge. They share a single line of sight across the blurred vertical scratched metal cage bars between them. [L07: soft out-of-focus stained concrete surface, low-key fluorescent daylight mixing with cold damp shadows, a faint dirty red warning tag angled away from the camera bleeding through the background blur].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C07",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "S#7: '사납게 짖으며 날뛰는 로트와일러 T.S'",
              "S#7: '맹견의 눈을 노려보는 수리영. 금방이라도 물어버릴 거 같던 맹견의 기세가 수그러드는데…'",
              "Shot 2 description: observer at kennel entrance, low angle, intense CU on Suriyoung's eyes looking down at Rottweiler."
            ],
            "visual_inferences": [
              "C01O02's dark eyes serve as the visual focal point against the damp, cold environment.",
              "C07's dark eye-line and paws in the smeared foreground anchor the confrontation from the animal's perspective.",
              "fixed_element: shelter_kennel_environment provides the damp concrete, cage bars, and harsh greenish fluorescent lighting."
            ],
            "creative_decisions": [
              "Framed as a head-and-shoulder composition to prevent floating head artifacts while maintaining a tight close-up feel on the face.",
              "Used the blurred vertical cage bars as a shared spatial anchor to connect the foreground C07 and the background C01O02.",
              "Integrated the faded red warning tag in the out-of-focus background as a symbolic accent contrasting with the cold greenish palette."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "5ae7233944b7474f",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b62b06f686faf841",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on prior scenes for this close framing.",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "C07",
          "P03",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "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 kennel entrance at rottweiler eye height, use an intense CU, low angle, shallow DOF on 수리영’s eyes as she bends into the cage line; this is an observer’s direct view held on the confrontation axis inherited from the dolly-in. Her face occupies the upper two-thirds of frame, slightly right of center, while blurred kennel bars and the rottweiler’s dark eye-line sit as smeared foreground edges at the lower left, keeping the shelter environment present but suppressed.",
            "lighting_mood": "Low-key fluorescent daylight mixes with cold damp shadows, with a faint dirty red warning tag barely bleeding through the 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",
              "C07",
              "P03",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C07",
                "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": 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": "shelter_kennel_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dimly lit indoor dog shelter characterized by a damp, wet concrete floor. Heavy vertical dark metal bars and wire kennel doors line the space, creating a repetitive structural boundary. The interior is illuminated by harsh, cold greenish overhead fluorescent lights, casting chilly and damp shadows across the corridor.",
                "applies_to_shots": [
                  2,
                  3,
                  5
                ],
                "source_facts": [
                  "Shot 2: 'Low-key fluorescent daylight mixes with cold damp shadows', 'blurred kennel bars'",
                  "Shot 3: 'wet concrete', 'cage bars remain vertical dark stripes', 'Cold overhead fluorescents'",
                  "Shot 5: 'Greenish shelter fluorescents', 'kennel doors stretching away'"
                ],
                "visual_inferences": [
                  "The wet concrete floor reflects the harsh fluorescent light, providing a consistent cold and damp texture across all shots.",
                  "The vertical metal bars act as a persistent architectural element that visually confines the space."
                ],
                "creative_decisions": [
                  "Maintaining a consistent greenish-cold color grade and wet floor texture to emphasize the sterile, damp, and somewhat bleak atmosphere of the animal shelter."
                ],
                "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": "C07O00",
                "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": "38479319860ae31d"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "순해진 맹견",
        "representative_moment": "C07이 귀를 뒤로 젖힌 채 바닥에 납작 엎드려 얌전해진 자세.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "floor-level observer composition with cold greenish grading",
            "t2i_prompt": "Photorealistic cinematic still. Observed from near the floor just inside the kennel threshold, C07O00, a large dog with dark brown short fur, a broad head, and a strong jaw, is flattened on the damp, wet concrete floor at a three-quarter angle from the right. The dog's pinned ears and front paws occupy the lower-center frame, its body receding diagonally toward the rear. The dog is looking down, with small highlights reflecting in its dark eyes. Focus on the subdued animal resting on the ground. A dimly lit indoor dog shelter surrounds the figure, with heavy vertical dark metal bars and wire kennel doors, wet with grime, forming repetitive dark stripes at both left and right frame edges. Harsh, cold greenish overhead fluorescent lights skim the wet concrete, casting chilly damp shadows and leaving the dog's body in heavy dimness. A dented metal food bowl rests near the rear background wall.",
            "outfit_assignments": [
              {
                "character_id": "C07",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "S#7 action: '기세가 꺾이며 순한 양처럼 얌전해지는 상태.'",
              "shot description: dog flattened on the floor, pinned ears, paws in foreground.",
              "kennel bars, wet concrete floor, and dented metal food bowl present in the space."
            ],
            "visual_inferences": [
              "fixed_element shelter_kennel_environment: dimly lit indoor dog shelter, heavy vertical dark metal bars, cold greenish overhead fluorescent lights.",
              "Observer POV is near the floor level to emphasize the dog's submission."
            ],
            "creative_decisions": [
              "Anchored the dog's paws in the lower-center frame to establish the floor-level perspective.",
              "Used heavy dimness on the dog's fur to contrast with the cold greenish reflections on the wet concrete."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "8c35e6ea54cccc70",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "128b7e3dcac81a45",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "exact_background ref_usage from S7_Shot2, maintaining the exact same dimly lit indoor dog shelter space and cold greenish lighting.",
        "_shot_index": 3,
        "visible_entities": [
          "C07",
          "P03",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just inside the kennel threshold, lower the lens almost to the wet concrete for a MWS, worm's eye view of the 로트와일러 flattened near the floor, continuing the tilt down from 수리영’s stare. The dog’s pinned ears and front paws sit in the central foreground, its body receding diagonally toward the rear of the kennel, while the cage bars remain vertical dark stripes at both frame edges.",
            "lighting_mood": "Cold overhead fluorescents skim the wet floor, leaving the dog’s black fur in heavy shadow with only small highlights on its eyes and muzzle.",
            "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",
              "P03",
              "L07"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C07",
                "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": "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": "shelter_kennel_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dimly lit indoor dog shelter characterized by a damp, wet concrete floor. Heavy vertical dark metal bars and wire kennel doors line the space, creating a repetitive structural boundary. The interior is illuminated by harsh, cold greenish overhead fluorescent lights, casting chilly and damp shadows across the corridor.",
                "applies_to_shots": [
                  2,
                  3,
                  5
                ],
                "source_facts": [
                  "Shot 2: 'Low-key fluorescent daylight mixes with cold damp shadows', 'blurred kennel bars'",
                  "Shot 3: 'wet concrete', 'cage bars remain vertical dark stripes', 'Cold overhead fluorescents'",
                  "Shot 5: 'Greenish shelter fluorescents', 'kennel doors stretching away'"
                ],
                "visual_inferences": [
                  "The wet concrete floor reflects the harsh fluorescent light, providing a consistent cold and damp texture across all shots.",
                  "The vertical metal bars act as a persistent architectural element that visually confines the space."
                ],
                "creative_decisions": [
                  "Maintaining a consistent greenish-cold color grade and wet floor texture to emphasize the sterile, damp, and somewhat bleak atmosphere of the animal shelter."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "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": "C07O00",
                "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": "b3a24276dc64b355"
      },
      {
        "scene_index": 7,
        "heading": "S#7. 유기견 보호원 / D",
        "beat_title": "부재중 전화",
        "representative_moment": "수리영(C01)이 액정 발신 화면을 굳은 표정으로 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "high angle through-object composition, cold greenish fluorescent vs small blue-white phone glow",
            "t2i_prompt": "Photorealistic cinematic still. High angle through-object composition. In the lower third foreground, P03, a smartphone angled upward toward the camera, its outgoing call screen glowing softly. C01O02 in a dark work jacket, a Korean young woman with long black hair, soft face shape, and dark eyes, is positioned in the center-right midground, at three-quarter angle from the right, hunched over the device, her eyes fixed on P03. Head-and-shoulder composition, her face occupying the center-right. [L07: heavy vertical dark metal kennel doors stretching away behind her left shoulder, illuminated by cold greenish overhead fluorescent lights]. Greenish shelter fluorescents flatten the ambient light on her shoulders and hair, while P03 casts a small cold blue-white glow upward, reflecting on her tense jaw and lower cheek. The visual weight of the frame rests on her hardened expression hanging above the glowing screen.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S7 action: 늦을 거 같다. 민숙에게 연락을 취해보지만, 받지 않는다.",
              "shot description: 수리영 looking down at outgoing call screen with a hardened face"
            ],
            "visual_inferences": [
              "fixed_element shelter_kennel_environment: heavy vertical dark metal bars and wire kennel doors",
              "fixed_element shelter_kennel_environment: cold greenish overhead fluorescent lights",
              "phone screen casts a localized cold glow on her face, contrasting with the ambient green light"
            ],
            "creative_decisions": [
              "High angle through-object composition anchoring the smartphone in the foreground to emphasize the failed contact attempt",
              "Greenish shelter fluorescents flattening the skin tone to enhance the tense, damp atmosphere"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "b40a4ff22223b720",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a75cf4c3d977f7e9",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "exact_background from earlier in the same scene (S7_Shot2)",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "P03",
          "L07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "In the shelter aisle at 수리영’s chest height, hold a static MCU, high angle through-object composition where the smartphone’s outgoing-call screen sits low in the foreground and her hardened face hangs above it in sharp emotional focus. The phone occupies only the lower third, angled upward toward camera, while 수리영 leans slightly over it in the center-right midground, kennel doors stretching away behind her left shoulder.",
            "lighting_mood": "Greenish shelter fluorescents flatten her skin tone, while the phone casts a small cold glow upward under her tense 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",
              "P03",
              "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": 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": "shelter_kennel_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dimly lit indoor dog shelter characterized by a damp, wet concrete floor. Heavy vertical dark metal bars and wire kennel doors line the space, creating a repetitive structural boundary. The interior is illuminated by harsh, cold greenish overhead fluorescent lights, casting chilly and damp shadows across the corridor.",
                "applies_to_shots": [
                  2,
                  3,
                  5
                ],
                "source_facts": [
                  "Shot 2: 'Low-key fluorescent daylight mixes with cold damp shadows', 'blurred kennel bars'",
                  "Shot 3: 'wet concrete', 'cage bars remain vertical dark stripes', 'Cold overhead fluorescents'",
                  "Shot 5: 'Greenish shelter fluorescents', 'kennel doors stretching away'"
                ],
                "visual_inferences": [
                  "The wet concrete floor reflects the harsh fluorescent light, providing a consistent cold and damp texture across all shots.",
                  "The vertical metal bars act as a persistent architectural element that visually confines the space."
                ],
                "creative_decisions": [
                  "Maintaining a consistent greenish-cold color grade and wet floor texture to emphasize the sterile, damp, and somewhat bleak atmosphere of the animal shelter."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "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": "daa1ced3465fab24"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "엇갈린 만남",
        "representative_moment": "마트 직원이 출입문을 가리키고, C01이 그 손길을 따라 시선을 옮기기 직전의 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium shot, eye-level OTS-pan composition, high-contrast lighting clashing interior fluorescents with blue dusk.",
            "t2i_prompt": "Photorealistic cinematic still. Medium shot, eye-level over-the-shoulder composition at shoulder height inside the supermarket near the front aisle. Two figures occupy the shared aisle near the checkout counter from the reference. In the foreground right, an adult East Asian woman in a worker uniform stands at a three-quarter angle from the left, her arm reaching across the right half of the frame pointing toward the background, her eyes fixed on the sliding door from the reference. In the left-midground, C01O02 in a casual jacket, a Korean young woman with long black hair, soft facial structure, and dark eyes, stands at a three-quarter angle from the right. Her weight is shifted back, standing still, her eyes fixed on the employee. The glass entrance doors of the large supermarket from the reference are brightly illuminated by harsh, white fluorescent lights from the interior. This bright interior light spills outward, creating a stark, high-contrast boundary against the deep blue ambient light of the dusk exterior. The harsh supermarket fluorescents clash with the blue dusk spill, muting colors except for small red sale stickers on the shelf from the reference. Focus on the physical space between the two characters, emphasizing the pointing gesture leading toward the illuminated exit.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#8 action: '여직원: 집에 간 거 아냐? 얼른 가봐.'",
              "shot description: 마트 유니폼을 입은 여직원이 수리영을 향해 손가락으로 출입문 쪽을 가리킨 찰나."
            ],
            "visual_inferences": [
              "fixed_element supermarket_entrance_lighting: The glass entrance doors of the large supermarket are brightly illuminated by harsh, white fluorescent lights from the interior. This bright interior light spills outward, creating a stark, high-contrast boundary against the deep blue ambient light of the dusk exterior."
            ],
            "creative_decisions": [
              "Over-the-shoulder composition anchors the foreground employee's gesture and midground C01 within the same physical space.",
              "Harsh fluorescent clash with blue dusk spill used to heighten the psychological tension of the missed connection and emphasize the exit."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d5b93deb6669a9eb",
              "owned_hash": "fb12484777d97415",
              "camera_direction_hash": "db4cff78465a7348",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "checkout counter",
                  "violating_phrase": "checkout counter from the reference",
                  "reason": "The phrase explicitly references the existing checkout counter from the background reference, so it is an anchor rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sliding door",
                  "violating_phrase": "sliding door from the reference",
                  "reason": "The sliding door is explicitly described as coming from the reference, which anchors it to the existing background object instead of creating a new one.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shelf",
                  "violating_phrase": "shelf from the reference",
                  "reason": "The shelf is only mentioned as part of the existing reference scene, so this is an anchor reference, not an instruction to redraw it.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct prior scene dependency for this specific visual moment",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "P03",
          "L08",
          "L09",
          "L10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the supermarket near the front aisle, use a MS, eye-level OTS-pan composition at shoulder height, resolving at the peak of 여직원’s pointing gesture toward the entrance in the background direction. 여직원’s extended hand cuts across the right half of the frame toward the lit doorway, while 수리영 remains left-midground in three-quarter view, absorbing the news rather than moving yet.",
            "lighting_mood": "Harsh supermarket fluorescents clash with blue dusk spill from the entrance, muting colors except for small red sale tags.",
            "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",
              "P03",
              "L08",
              "L09",
              "L10"
            ],
            "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_store_sales_floor_dusk_busy_exit_visible",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "ceiling light",
              "checkout counter",
              "checkout lane",
              "customer service counter",
              "endcap display",
              "floor tile",
              "produce bin",
              "promotional display",
              "refrigerated case",
              "security gate",
              "shelf",
              "shopping cart",
              "signage",
              "sliding door",
              "stanchion",
              "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": "supermarket_entrance_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The glass entrance doors of the large supermarket are brightly illuminated by harsh, white fluorescent lights from the interior. This bright interior light spills outward, creating a stark, high-contrast boundary against the deep blue ambient light of the dusk exterior.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "Shot 4 lighting mentions: 'Harsh supermarket fluorescents clash with blue dusk spill from the entrance'",
                  "Shot 5 lighting mentions: 'Blue dusk, sodium streetlamp haze, and supermarket spill light'"
                ],
                "visual_inferences": [
                  "The entrance area serves as a continuous visual anchor, meaning the lighting contrast must be identical whether viewed from the inside looking out (Shot 4) or the outside looking in (Shot 5)."
                ],
                "creative_decisions": [
                  "Emphasizing the clash between the cold/harsh fluorescent interior and the cool blue dusk to create a consistent mood across the location transition."
                ],
                "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": "background",
                "id": "bg_store_sales_floor_dusk_busy_exit_visible",
                "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": "c04d1b1f78d5d4fc"
      },
      {
        "scene_index": 8,
        "heading": "S#8. 번화가·대형 마트 / 해질 무렵",
        "beat_title": "엇갈린 만남과 연락 두절",
        "representative_moment": "마트 출입문 밖 가로등 아래서 전화를 받지 않는 엄마에게 연락을 시도하며 서 있는 수리영의 불안한 실루엣.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Observer POV, static medium-wide framing, low angle from slightly below eye level, high-contrast dusk and neon lighting",
            "t2i_prompt": "Photorealistic cinematic still. Shot from a low observer position slightly below eye level, C01O02 in a dark jacket, a Korean young woman in her 20s with long black hair, soft facial shape, and dark eyes, stands in left profile under the streetlamp from the reference. She occupies the right third of the frame, holding a P03 smartphone pressed to her ear, with eyes looking down. The figure appears as a dark silhouette against the damp neon reflections, but body volume is preserved with rim light tracing her shoulders and jacket outline, ensuring her upper chest and the phone remain clearly visible in the frame. Focus on the tense posture of the silhouette in the urban dusk. Behind her, the glass entrance doors of the large supermarket from the reference are brightly illuminated by harsh, white fluorescent lights from the interior. This bright interior light spills outward across the sidewalk from the reference, creating a stark, high-contrast boundary against the deep blue ambient light of the dusk exterior. The wet street and curb from the reference catch the sodium haze and soft focus neon reflections, while the awning and signboard from the reference anchor the upper background, with her shoes visible at the lower frame edge.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Suri-young steps out of the mart and tries to make a call but gets no answer.",
              "Shot 5: Suri-young standing outside under a streetlamp near the supermarket entrance, smartphone pressed to her ear."
            ],
            "visual_inferences": [
              "fixed_element: The glass entrance doors of the large supermarket are brightly illuminated by harsh, white fluorescent lights from the interior.",
              "fixed_element: This bright interior light spills outward, creating a stark, high-contrast boundary against the deep blue ambient light of the dusk exterior.",
              "The low camera angle naturally places the wet sidewalk and her shoes in the lower frame, and the awning/signboard in the upper background."
            ],
            "creative_decisions": [
              "Placed C01O02 in the right third of the frame to emphasize the empty spatial depth and her feeling of isolation.",
              "Applied strict entity-aware silhouette rules by ensuring body volume is preserved with rim light, preventing a flat black cutout effect while keeping the dark thriller mood.",
              "Anchored background elements directly to the provided exact_background reference to ensure continuity."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "5d4be50cca6269f2",
              "owned_hash": "5e3a76c79931ff06",
              "camera_direction_hash": "ee4edca794787089",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "streetlamp",
                  "violating_phrase": "under the streetlamp from the reference",
                  "reason": "The phrase explicitly references the existing streetlamp from the reference, which anchors the shot rather than instructing a new one to be created.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "the glass entrance doors of the large supermarket from the reference",
                  "reason": "The doors are mentioned as part of the existing reference scene, so this is an anchor reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sidewalk",
                  "violating_phrase": "across the sidewalk from the reference",
                  "reason": "The sidewalk is used as a spatial reference from the existing scene, not as an instruction to add or modify it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curb",
                  "violating_phrase": "the wet street and curb from the reference",
                  "reason": "The curb is referenced as an already-existing background element from the reference, so it is an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "awning",
                  "violating_phrase": "the awning ... from the reference",
                  "reason": "The awning is explicitly tied to the reference scene, which makes it an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "signboard",
                  "violating_phrase": "the signboard from the reference",
                  "reason": "The signboard is described as coming from the reference scene, so it is not a redraw instruction.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "exact_background continuity from S8_Shot4 for the continuous supermarket entrance exterior.",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "P03",
          "L08",
          "L09",
          "L10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside across the sidewalk, hold a static WS, low angle silhouette from slightly below eye level, five to six meters from 수리영 under the streetlamp near the supermarket entrance. She occupies the right third as a dark figure with the phone pressed to her ear, while the entrance glow and wet pavement reflections stretch behind her, preserving the directional cut from the employee’s pointing hand.",
            "lighting_mood": "Blue dusk, sodium streetlamp haze, and supermarket spill light render her mostly black against damp neon reflections.",
            "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",
              "P03",
              "L08",
              "L09",
              "L10"
            ],
            "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_entrance_exterior_dusk_neon_streetlamp",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "awning",
              "bollard",
              "curb",
              "door",
              "sidewalk",
              "signboard",
              "storefront",
              "street",
              "streetlamp",
              "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": "supermarket_entrance_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The glass entrance doors of the large supermarket are brightly illuminated by harsh, white fluorescent lights from the interior. This bright interior light spills outward, creating a stark, high-contrast boundary against the deep blue ambient light of the dusk exterior.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "Shot 4 lighting mentions: 'Harsh supermarket fluorescents clash with blue dusk spill from the entrance'",
                  "Shot 5 lighting mentions: 'Blue dusk, sodium streetlamp haze, and supermarket spill light'"
                ],
                "visual_inferences": [
                  "The entrance area serves as a continuous visual anchor, meaning the lighting contrast must be identical whether viewed from the inside looking out (Shot 4) or the outside looking in (Shot 5)."
                ],
                "creative_decisions": [
                  "Emphasizing the clash between the cold/harsh fluorescent interior and the cool blue dusk to create a consistent mood across the location transition."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [
              {
                "scene_index": 19,
                "shot_index": 6,
                "description": "마트 밖 가로등 아래서 스마트폰을 귀에 바짝 댄 수리영의 상체.",
                "keep_elements": [
                  "the same woman outside the mart entrance",
                  "the smartphone at her ear",
                  "the dark jacket",
                  "the cold blue night lighting",
                  "the streetlamp glow"
                ]
              }
            ],
            "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_entrance_exterior_dusk_neon_streetlamp",
                "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": "18b0dd05380c2cf7"
      },
      {
        "scene_index": 9,
        "heading": "S#9. 해안가 / N",
        "beat_title": "빗속의 다급한 질주",
        "representative_moment": "페달을 힘껏 밟으며 비 내리는 해안도로를 질주하는 C01의 굳은 얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "close-up, Dutch angle handheld tracking frame from front-quarter",
            "t2i_prompt": "Photorealistic cinematic still. From a tight front-quarter tracking position just ahead of the bicycle, Dutch angle frame at head height. C01O02 in a wet dark jacket, the same Korean young woman with dark eyes, at three-quarter angle from the right. Head-and-shoulder composition, her pale rigid face occupying the left-center, shoulders pitched forward over a wet bicycle handlebar and front frame visible at the lower-left edge, one knee driving up into the lower frame in mid-pedal, long black hair streaming backward in the direction opposite to motion, eyes fixed on the distance. [L06: a rain-soaked coastal road with blurred wet metal guardrail streaking past, heavy rain and wet surface catching the moonless blue-black ambient light, a distant red harbor blink puncturing the mist].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#9 action: '해안도로를 자전거를 타고 바삐 집으로 달려가는 수리영.'",
              "shot description: '페달에 체중을 싣고 상체를 앞으로 숙인 수리영의 창백하고 굳은 얼굴.'"
            ],
            "visual_inferences": [
              "motion freeze: mid-pedal posture with long hair streaming backward opposite to the direction of motion",
              "wet environment explicitly tied to the forward zoom target constraints (heavy rain, wet surface)"
            ],
            "creative_decisions": [
              "tight Dutch angle framing combined with motion blur to emphasize speed and urgency",
              "moonless blue-black coastal light to create a dark, thriller-esque atmosphere",
              "integration of required forward continuity elements (hair, posture, handlebar, rain) naturally into the close frame"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "956fb47e6043f52f",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "7b2f021221253605",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 6,
        "dependency_reason": "zoom_in_detail focus retaining the same subject and environment from S6_Shot2",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 9,
            "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 a tight front-quarter tracking position just ahead of the bicycle, use a CU, Dutch angle, handheld tracking frame at 수리영’s head height as she rides hard along the wet coastal road. Her pale rigid face fills the left-center of frame while her shoulders pitch forward and one knee drives up from the lower edge, making the weight on the pedals readable without losing the urgent face focus.",
            "lighting_mood": "Moonless blue-black coastal light and smeared road reflections bleach her face while a distant red harbor blink punctures the mist.",
            "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",
              "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": 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": [
              {
                "scene_index": 6,
                "shot_index": 2,
                "ref_usage": "zoom_in_detail",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [
              {
                "scene_index": 24,
                "shot_index": 2,
                "description": "굵은 빗방울이 사정없이 뺨에 맺힌 수리영의 굳센 표정 클로즈업.",
                "keep_elements": [
                  "the same young woman on the bicycle",
                  "the same forward-leaning riding posture",
                  "the bicycle handlebar at the lower-left edge",
                  "the coastal road background with motion blur",
                  "the long black hair streaming backward",
                  "the heavy rain and wet surface"
                ]
              }
            ],
            "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": "a2d4e0e64a21fc8b"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "문틈 사이로 스며드는 낯선 남자의 그림자",
        "representative_moment": "미세하게 열린 옥탑방 철문 문틈 사이로 C11의 짙고 억눌린 실루엣이 드리워져 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up, Dutch angle, voyeuristic through-object view aligned with the narrow door gap, cold blue-black night tone",
            "t2i_prompt": "Photorealistic cinematic still. Close-up, voyeuristic through-object view at chest height with a slight Dutch angle, aligned with a narrow vertical door gap. [L04: A slightly open metal entrance door with chipped dark paint and a wet concrete wall border the outer frame edges.] The narrow slit occupies the central third of the frame, bordered by an old, rust-stained damp doorjamb forming an oppressive foreground. Inside the gap, C11O12 in a dark jacket, a Korean adult male, is pressed near the doorway in three-quarter left profile, leaning inward. Showing the variant features carried from stable_traits: his face fully obscured and swallowed in pure black shadow with no discernible facial features, projecting a blurred impression. His dark body volume is faintly preserved by the dim ambient fill. A creased advertising flyer is partly wedged near the lower door seam. Cold blue-black night ambient light washes the damp exterior walls and reflects on the metallic door edges, while the interior space remains entirely black. Focus on the claustrophobic narrow gap and the ominous silhouette compressed within.",
            "outfit_assignments": [
              {
                "character_id": "C11",
                "outlook_id": "O12"
              }
            ],
            "source_facts": [
              "Scene text: 남자의 긴 그림자. (얼굴은 보이지 않는다)",
              "Shot 4 description: 미세하게 열린 문틈 사이로 낯선 남자의 짙은 검은 실루엣이 드리워진 형태",
              "Shot 4 lighting: A dim rooftop practical leaves the door edges cold and metallic while the interior remains almost pure black"
            ],
            "visual_inferences": [
              "fixed_element rooftop_exterior_environment: Consistent wet and damp texture on the exterior walls with cold blue-black darkness",
              "C11 pose: pressed near doorway, three-quarter left profile, leaning inward"
            ],
            "creative_decisions": [
              "voyeuristic through-object view with a Dutch angle to heighten suspense",
              "compressing the subject into the central third of the frame using the doorframe as an oppressive foreground border",
              "carrying the 'face fully obscured' trait directly into the shadow depiction to avoid standard facial rendering"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "3cd62926e8e61170",
              "owned_hash": "47e0466dfeaed99f",
              "camera_direction_hash": "c60d6f3ccc0b7185",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "S4_Shot1의 옥탑방 외부(밤) 분위기와 조명 톤을 연속적으로 유지 (atmosphere_reference)",
        "_shot_index": 4,
        "visible_entities": [
          "C11",
          "P02",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Very close to the rooftop room door at chest height, push into a CU, Dutch angle, through-object view aligned with the narrow vertical door gap. The slit occupies the central third of frame, never wider than a handspan, and the 낯선 남자’s black silhouette compresses inside it, face unreadable, with chipped door paint and the dark jamb forming oppressive foreground borders.",
            "lighting_mood": "A dim rooftop practical leaves the door edges cold and metallic while the interior remains almost pure black, swallowing the man’s features.",
            "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",
              "P02",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C11",
                "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": "cb_rooftop_night_intrusion_door_ajar",
            "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": "rooftop_exterior_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior of a small rooftop building at night. The surrounding walls and atmosphere are bathed in cold, blue-black darkness with mist-dampened surfaces. Dim, sparse ambient lighting leaves the architectural details largely in deep, oppressive shadows.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "Scene text: N (Night), rooftop",
                  "Shot 4 lighting: A dim rooftop practical leaves the door edges cold and metallic",
                  "Shot 5 lighting: the exterior stays blue-black and mist dampened"
                ],
                "visual_inferences": [
                  "Consistent wet and damp texture on the exterior walls",
                  "Unified cold blue-black ambient night light across the entire rooftop exterior space"
                ],
                "creative_decisions": [
                  "Emphasizing the oppressive, chilling mood by keeping the exterior details mostly obscured by deep shadows to contrast with the violent action"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "atmosphere_reference",
                "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": "C11O12",
                "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": "4dd48ef776c4a9b9"
      },
      {
        "scene_index": 10,
        "heading": "S#10. 옥탑방 / N",
        "beat_title": "창문에 비친 끔찍한 그림자",
        "representative_moment": "어두운 옥탑방 창문 너머로, C11이 C04를 덮치는 폭력적인 실루엣이 유리에 맺힌다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight medium shot, low angle focused on the dirty glass, contrasting cold blue-black exterior night with weak yellow interior backlight.",
            "t2i_prompt": "Photorealistic cinematic still. A tight medium shot from a low angle outside the rooftop, focusing on the closed, dirty window from the reference. The clothesline from the reference is slightly out of focus at the frame edge. Behind the condensation-lined glass, two figures share the confined interior space, heavily backlit by a weak yellow interior light. C11O12 in a dark intrusion outfit, a Korean adult man with dark hair, acts as the one driving the action, standing at a three-quarter angle from the right. His weight forcefully presses forward, lunging over the other figure's shoulder. His face is fully swallowed in shadow with no discernible features, maintaining a blurry impression, but his dark body volume is preserved with cold rim light tracing his shoulders. C04O05 in casual indoor wear, a middle-aged Korean woman with dark hair, is the constrained figure, positioned in left profile and forcefully twisted away. Her gentle facial lines and jaw contour are faintly visible against the rim light, her dark eyes looking up in intense distress. Their entangled, forceful dark shapes press near the pane. The surrounding damp exterior wall from the reference is bathed in a cold blue-black night ambient, preserving the oppressive exterior environment.",
            "outfit_assignments": [
              {
                "character_id": "C11",
                "outlook_id": "O12"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "Scene text: 창문에 비친 그림자. 민숙을 덮쳐 어깨를 물어뜯는 듯한 모습",
              "Shot 5 DP instruction: Outside the rooftop window at shoulder height, track into a tight MS, low angle reflection composition favoring the glass surface",
              "Shot 5 lighting: Weak yellow interior backlight throws monstrous black silhouettes onto dirty glass"
            ],
            "visual_inferences": [
              "fixed_element: The exterior walls and atmosphere are bathed in cold, blue-black darkness with mist-dampened surfaces",
              "Characters are seen through the glass as solidly backlit figures rather than flat 2D shadows, preserving physical volume while their faces are mostly obscured",
              "Violence interaction framing applies: C11 is the force initiator pressing forward, and C04 is the constrained figure twisting away in distress"
            ],
            "creative_decisions": [
              "Used entity-aware silhouette policy for C11 to ensure his face remains entirely featureless in shadow, while maintaining shoulder and body depth via rim light",
              "Anchored the scene firmly to the reference image by integrating 'the window from the reference' and 'the exterior wall from the reference' directly into the framing",
              "Included the clothesline from the reference as an out-of-focus frame edge element to add depth without distracting from the main action"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "fdac2619075a6510",
              "owned_hash": "47e0466dfeaed99f",
              "camera_direction_hash": "082cdc7a5d506891",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "window",
                  "violating_phrase": "the closed, dirty window from the reference",
                  "reason": "The owned object is explicitly referenced as already present from the reference, which anchors it rather than instructing a new creation or modification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "clothesline",
                  "violating_phrase": "The clothesline from the reference",
                  "reason": "The owned object is explicitly mentioned as coming from the reference, so this is an anchored reference, not a redraw instruction.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 10,
        "dependency_reason": "Shot 4의 옥탑방 외부 조명(cold blue-black darkness) 및 분위기와 공간적 연속성을 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C11",
          "C04",
          "P02",
          "L04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside the rooftop window at shoulder height, track into a tight MS, low angle reflection composition favoring the glass surface rather than the room interior. The window fills the middle of the frame but not the whole image, with wet exterior wall edges visible around it, and the enlarged tangled shadows of 낯선 남자 and 민숙 loom across the glass as if pinned to the pane.",
            "lighting_mood": "Weak yellow interior backlight throws monstrous black silhouettes onto dirty glass, while the exterior stays blue-black and mist dampened.",
            "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",
              "C04",
              "P02",
              "L04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C11",
                "outlook_id": "O12"
              },
              {
                "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": "cb_rooftop_night_intrusion_door_ajar",
            "reference_usage": "exact_background",
            "owned_objects": [
              "clothesline",
              "door",
              "parapet wall",
              "pipe",
              "platform",
              "post",
              "roof drain",
              "rooftop deck",
              "stairwell bulkhead",
              "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": "rooftop_exterior_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior of a small rooftop building at night. The surrounding walls and atmosphere are bathed in cold, blue-black darkness with mist-dampened surfaces. Dim, sparse ambient lighting leaves the architectural details largely in deep, oppressive shadows.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "Scene text: N (Night), rooftop",
                  "Shot 4 lighting: A dim rooftop practical leaves the door edges cold and metallic",
                  "Shot 5 lighting: the exterior stays blue-black and mist dampened"
                ],
                "visual_inferences": [
                  "Consistent wet and damp texture on the exterior walls",
                  "Unified cold blue-black ambient night light across the entire rooftop exterior space"
                ],
                "creative_decisions": [
                  "Emphasizing the oppressive, chilling mood by keeping the exterior details mostly obscured by deep shadows to contrast with the violent action"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 10,
                "shot_index": 4,
                "ref_usage": "atmosphere_reference",
                "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": "C11O12",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "cb_rooftop_night_intrusion_door_ajar",
                "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": "4083e91a7b7c1160"
      },
      {
        "scene_index": 11,
        "heading": "S#11. 옥탑 방 밖 / N",
        "beat_title": "급박한 계단 오르기와 감지된 이상 징후",
        "representative_moment": "C01 bounds up the steep rooftop stairs in a tense, dynamic mid-stride.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height tracking medium wide shot in right profile, hard blue-gray contrast with cold night lighting.",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a casual jacket, a young Korean woman, in right profile, captured mid-stride bounding up the steep concrete staircase from the reference. Her body leans forward diagonally upward across the center of the frame, one knee raised high. Her long black hair flows back in the direction opposite to motion, soft facial contour visible, dark eyes looking up toward a faint off-screen glow. The observer tracks from a waist-height angle beside her, keeping her upper body, torso, and raised knee in frame. The rusted metal stair railing and stained concrete wall from the reference rush past as dark, damp background planes. Deep, muted blue-black shadows fill the environment, with cold night ambient light leaving her moving figure in hard blue-gray contrast. Focus on her dynamic upward momentum against the narrow stairwell.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Shot 2 description: Suryeong bounding up steep concrete stairs, side profile, one foot landing, other suspended mid-air, body leaning forward.",
              "DP instruction: track with Suryeong in a MWS, high angle at waist height, freeze the kinetic instant.",
              "Lighting: Cold night ambient and a weak rooftop bulb catch the wet stair edges, leaving her moving body in hard blue-gray contrast."
            ],
            "visual_inferences": [
              "fixed_element night_exterior_lighting: dark, damp exterior environment, deep blue-black shadows, wet concrete surfaces.",
              "Camera frame rule: a waist-height tracking camera keeps the torso, upper body, and raised knee in frame while the lower leg may be partially implied outside the edge."
            ],
            "creative_decisions": [
              "Anchored owned background objects (staircase, railing, wall) with 'from the reference' to satisfy background_ref_attached binding without creating phantom objects.",
              "Applied mid-stride freeze with hair flowing opposite to motion to capture the kinetic instant without using motion blur."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d1f3e5209f2b8994",
              "owned_hash": "dd4483bd10980271",
              "camera_direction_hash": "8a229f7b5723d3f6",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "stair",
                  "violating_phrase": "the steep concrete staircase",
                  "reason": "The prompt references stair as part of the existing staircase and only describes the scene composition from the reference, with no explicit instruction to create or modify a stair.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "the stained concrete wall",
                  "reason": "The wall is mentioned as an existing background plane from the reference, not as something to add or redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Side-on along the steep concrete staircase, track with 수리영 in a MWS, high angle at waist height, preserving the lateral profile from the approach stage. Freeze the kinetic instant with one foot landing on the next step and the other suspended behind her; she cuts diagonally upward across the center of frame while the stair rail and concrete wall rush past as damp, close background planes.",
            "lighting_mood": "Cold night ambient and a weak rooftop bulb catch the wet stair edges, leaving her moving body in hard blue-gray contrast.",
            "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",
              "L11"
            ],
            "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": "cb_stairs_night_return_door_ajar",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "curb",
              "door",
              "drain grate",
              "gate",
              "handrail",
              "landing",
              "light",
              "paving",
              "planter",
              "stair",
              "storage box",
              "utility meter",
              "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": [
              {
                "element_id": "night_exterior_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, damp exterior environment of an old residential building at night. The scene is enveloped in deep, muted blue-black shadows, which are only slightly broken by the faint, cold glow of a weak light bulb reflecting off the wet concrete surfaces.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "source_facts": [
                  "Shot 2: Cold night ambient and a weak rooftop bulb catch the wet stair edges",
                  "Shot 4: Muted blue-black rooftop darkness is broken only by a weak offscreen bulb"
                ],
                "visual_inferences": [
                  "The concrete surfaces appear slightly wet or damp, reflecting the weak light to enhance the chilling, grim atmosphere"
                ],
                "creative_decisions": [
                  "Establish visual continuity between the staircase and the rooftop through a consistent color grading of cold blue-black shadows and sparse practical lighting"
                ],
                "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": "background",
                "id": "cb_stairs_night_return_door_ajar",
                "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": "77155e8914688c9b"
      },
      {
        "scene_index": 11,
        "heading": "S#11. 옥탑 방 밖 / N",
        "beat_title": "불길한 귀가",
        "representative_moment": "아무도 없는 어두운 옥상, 반쯤 열린 채 새카만 내부를 드러내는 현관 철문.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "locked symmetrical eye-level frontal frame, muted blue-black darkness",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the half-open metal door from the reference in a locked symmetrical eye-level frontal frame, with no human figure visible. The door sits in the middle third at a medium distance, its surface illuminated by the faint, cold glow of a weak offscreen bulb. The interior beyond the threshold is an unlit, opaque black void absorbing all light. The rooftop concrete floor is damp and gritty with scattered debris, enveloped in deep, muted blue-black shadows. A dark, wet water tank is partly visible at the frame edge, alongside a slack, sagging clothesline, keeping scale and silence around the chilling exterior environment.",
            "outfit_assignments": [],
            "source_facts": [
              "S#11 action: 옥상에 올라와 보니 반쯤 열린 현관 철문.",
              "shot description: eye-level frontal frame centered on the half-open metal entrance door, with no human figure visible."
            ],
            "visual_inferences": [
              "fixed_element night_exterior_lighting: deep, muted blue-black shadows, faint cold glow reflecting off wet concrete surfaces.",
              "DP instructions: interior void absorbing light, damp rooftop floor, water tank edge, sagging clothesline for scale."
            ],
            "creative_decisions": [
              "Anchored the central object with 'the door from the reference' as dictated by the background_binding owned_objects constraint.",
              "Maintained an empty frame with symmetrical composition to emphasize the ominous atmosphere and the threat lurking inside the dark interior."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "903cab1ca83ee771",
              "owned_hash": "dd4483bd10980271",
              "camera_direction_hash": "f9407fcfa5b013b4",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "the half-open metal door from the reference",
                  "reason": "The phrase explicitly references an existing door from the reference rather than instructing a new door to be created or added.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "Shot 2의 동일한 옥탑방 외부 배경의 연속선상에 위치하며, fixed_element로 지정된 밤 시간대의 푸른빛이 도는 어두운 조명(night_exterior_lighting)을 정확히 유지함.",
        "_shot_index": 4,
        "visible_entities": [
          "L11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "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 dark rooftop, settle into a locked symmetrical WS, eye-level frontal frame centered on the half-open metal entrance door, with no human figure visible. The door sits in the middle third at medium distance, the black interior beyond it absorbing light, while the rooftop floor, water tank edge, and sagging clothesline keep scale and silence around the threat.",
            "lighting_mood": "Muted blue-black rooftop darkness is broken only by a weak offscreen bulb, making the open doorway read as a flat, threatening void.",
            "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": [
              "L11"
            ],
            "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_stairs_night_return_door_ajar",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "curb",
              "door",
              "drain grate",
              "gate",
              "handrail",
              "landing",
              "light",
              "paving",
              "planter",
              "stair",
              "storage box",
              "utility meter",
              "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": [
              {
                "element_id": "night_exterior_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, damp exterior environment of an old residential building at night. The scene is enveloped in deep, muted blue-black shadows, which are only slightly broken by the faint, cold glow of a weak light bulb reflecting off the wet concrete surfaces.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "source_facts": [
                  "Shot 2: Cold night ambient and a weak rooftop bulb catch the wet stair edges",
                  "Shot 4: Muted blue-black rooftop darkness is broken only by a weak offscreen bulb"
                ],
                "visual_inferences": [
                  "The concrete surfaces appear slightly wet or damp, reflecting the weak light to enhance the chilling, grim atmosphere"
                ],
                "creative_decisions": [
                  "Establish visual continuity between the staircase and the rooftop through a consistent color grading of cold blue-black shadows and sparse practical lighting"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 11,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "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_stairs_night_return_door_ajar",
                "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": "22cd957d4018b996"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "참혹한 현장 발견",
        "representative_moment": "방문 입구에서 바라본, 방바닥에 흥건한 피와 커튼 쪽으로 이어진 핏자국의 섬뜩한 모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low-waist-height medium shot with a slight high angle, observer POV, shallow DOF, cold gray-green tint",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the smeared footprint from the reference on the floor. The interior of the bedroom is immersed in a cold, low-key lighting with a gray-green tint. Deep, muted shadows dominate the space, casting a chilling, underlit darkness over the room's surroundings. At low-waist height with a slight high angle, the floor from the reference occupies the lower two-thirds of the frame. Pooled blood sits in the mid-foreground, and the footprint from the reference forms a diagonal line toward the far curtain at frame center-right. A long, hanging curtain from the reference is positioned towards the right side of the room. It hangs straight down, remaining mostly in shadow and acting as a dark, vertical boundary within the dim space. The open door from the reference frames the foreground edges as a dark boundary. The bed from the reference sits partly in shadow beside the wall. The blood carries a deep red accent against the cold gray-green darkness.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 6: 문이 열린 수리영 방 바닥에 흥건한 핏자국과 피 묻은 발자국이 커튼 쪽으로 이어진 참혹한 실내 풍경."
            ],
            "visual_inferences": [
              "fixed_element cold_dim_bedroom_lighting: cold, low-key lighting with a gray-green tint",
              "fixed_element vertical_hanging_curtain: hanging straight down, remaining mostly in shadow",
              "Observer POV from just inside the doorway looking down at the bloody trail",
              "The open door frames the shot as a dark foreground boundary"
            ],
            "creative_decisions": [
              "Low-waist height with a slight high angle to emphasize the trail of blood on the floor",
              "Used 'from the reference' to anchor the owned objects according to the background_binding constraints",
              "Deep red accent on the blood against the gray-green ambient lighting to maximize the horror tension"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "aee95513bd293310",
              "owned_hash": "601128658431b6e5",
              "camera_direction_hash": "f4685163b3a30ad4",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "footprint",
                  "violating_phrase": "the smeared footprint from the reference",
                  "reason": "The footprint is explicitly referenced as coming from the reference, which anchors it rather than instructing a new creation.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "the floor from the reference",
                  "reason": "The floor is mentioned with an explicit reference cue, indicating anchoring to the existing background object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "A long, hanging curtain from the reference",
                  "reason": "The curtain is explicitly tied to the reference, so this is a reference-based mention, not a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "The open door from the reference",
                  "reason": "The door is explicitly described as from the reference, which makes it an anchored existing object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bed",
                  "violating_phrase": "The bed from the reference",
                  "reason": "The bed is explicitly marked as from the reference, so it is a reference anchor rather than a new object request.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "P10",
          "P03",
          "P04",
          "P01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "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 just inside 수리영’s open bedroom doorway, hold a low-waist-height WS with a slight high angle, the camera lowered below the stage default so the floor occupies the lower two-thirds while the opened doorway stays as a dark rear boundary. In direct observer vision, the pooled blood sits in the mid-foreground and the bloody footprints form a diagonal line toward the far curtain at frame center-right, using shallow DOF only lightly so the curtain remains the endpoint of the trail.",
            "lighting_mood": "Low-key room light and spill from the living room flatten into a cold gray-green darkness, with the blood carrying the only deep red 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": [
              "C01",
              "P10",
              "P03",
              "P04",
              "P01",
              "L05"
            ],
            "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": "cb_daughter_room_night_blood_footprints",
            "reference_usage": "exact_background",
            "owned_objects": [
              "backpack",
              "bed",
              "curtain",
              "door",
              "floor",
              "footprint",
              "outline",
              "photograph",
              "pillow",
              "toy",
              "wall",
              "wall mark",
              "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_dim_bedroom_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the bedroom is immersed in a cold, low-key lighting with a gray-green tint. Deep, muted shadows dominate the space, casting a chilling, underlit darkness over the room's surroundings.",
                "applies_to_shots": [
                  6,
                  9,
                  16
                ],
                "source_facts": [
                  "Low-key room light and spill from the living room flatten into a cold gray-green darkness (Shot 6)",
                  "room collapses into a dark blur, gray-pale against muted shadows (Shot 9)",
                  "The room remains cold and underlit (Shot 16)"
                ],
                "visual_inferences": [
                  "A persistent eerie, desaturated color palette unifies the grim discovery sequence regardless of camera angle."
                ],
                "creative_decisions": [
                  "Maintained consistent background illumination across different focal lengths to ensure the environment consistently feels oppressive and dark."
                ],
                "confidence": "high"
              },
              {
                "element_id": "vertical_hanging_curtain",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A long, hanging curtain is positioned towards the right side of the room. It hangs straight down, remaining mostly in shadow and acting as a dark, vertical boundary within the dim space.",
                "applies_to_shots": [
                  6,
                  9
                ],
                "source_facts": [
                  "far curtain at frame center-right (Shot 6)",
                  "the curtain only a soft vertical smear at the right edge (Shot 9)"
                ],
                "visual_inferences": [
                  "The curtain is drawn heavily, concealing the space behind it and forming a distinct vertical line in the background geometry."
                ],
                "creative_decisions": [
                  "Kept the curtain aligned on the right edge of the frame to anchor spatial continuity between the wide floor shot and the tight facial close-up."
                ],
                "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": "background",
                "id": "cb_daughter_room_night_blood_footprints",
                "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": "8d8bebf13aae23e8"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / 민숙 방 / 수리영 방",
        "beat_title": "어둠 속에 드러난 참혹한 시신과 얼어붙은 수리영",
        "representative_moment": "C01 freezes in shock, eyes widened and mouth half-open, isolated against the dark blurred room.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "handheld close framing at eye-level, shallow DOF, cold gray-green low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a dark casual jacket, a Korean young woman with long black hair, soft facial shape, and dark eyes, occupies the center frame, shoulders and upper chest visible. She is facing the camera, frozen in a backward flinch, her dark eyes widened and fixed on the shadowy space below the right side of the frame, her mouth half-open in shock. A weak, cold practical light grazes her face from below-left, leaving her pupils glossy and her skin gray-pale against deep, muted shadows. The surrounding space collapses into a dark, out-of-focus blur under a chilling gray-green ambient tint. A long, hanging curtain forms a soft, dark vertical smear along the right edge of the frame, fully immersed in shadow within the shallow depth of field.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "충격에 두 눈을 크게 뜨고 입을 반쯤 벌린 채 얼어붙은 수리영의 얼굴 클로즈업.",
              "수리영: facing_camera, frozen backward flinch, eyes→커튼 아래 공간",
              "Near the curtain and bed area, push into a handheld CU at eye-level, tighter and more frontal... isolating 수리영’s widened eyes and half-open mouth",
              "A weak, cold practical light grazes her face from below-left, leaving her pupils glossy and her skin gray-pale"
            ],
            "visual_inferences": [
              "fixed_element cold_dim_bedroom_lighting: cold, low-key lighting with a gray-green tint, deep muted shadows",
              "fixed_element vertical_hanging_curtain: long, hanging curtain positioned towards the right side of the room",
              "close framing focuses entirely on her facial reaction, blurring out the gruesome elements to heighten internal horror"
            ],
            "creative_decisions": [
              "Applied shallow depth of field to isolate C01's face, turning the curtain into a soft vertical smear on the right frame edge",
              "Directed the practical light from below-left to enhance the glossy reflections in her eyes and emphasize her pale skin against the dark background"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "7b10056b33ffd376",
              "owned_hash": "b0bfa88101c56b24",
              "camera_direction_hash": "0fd680f47280135b",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Same room, continuous sequence of finding the body.",
        "_shot_index": 9,
        "visible_entities": [
          "C01",
          "P10",
          "P03",
          "P04",
          "P01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Near the curtain and bed area, push into a handheld CU at eye-level, tighter and more frontal than the flow default, isolating 수리영’s widened eyes and half-open mouth while the room collapses into a dark blur around her. The frame holds her face near center with the curtain only a soft vertical smear at the right edge, using shallow DOF to make the horror feel like it is pressing directly into her breath.",
            "lighting_mood": "A weak, cold practical light grazes her face from below-left, leaving her pupils glossy and her skin gray-pale against muted shadows.",
            "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",
              "P10",
              "P03",
              "P04",
              "P01",
              "L05"
            ],
            "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": "cb_daughter_room_night_body_red_mark",
            "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_dim_bedroom_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the bedroom is immersed in a cold, low-key lighting with a gray-green tint. Deep, muted shadows dominate the space, casting a chilling, underlit darkness over the room's surroundings.",
                "applies_to_shots": [
                  6,
                  9,
                  16
                ],
                "source_facts": [
                  "Low-key room light and spill from the living room flatten into a cold gray-green darkness (Shot 6)",
                  "room collapses into a dark blur, gray-pale against muted shadows (Shot 9)",
                  "The room remains cold and underlit (Shot 16)"
                ],
                "visual_inferences": [
                  "A persistent eerie, desaturated color palette unifies the grim discovery sequence regardless of camera angle."
                ],
                "creative_decisions": [
                  "Maintained consistent background illumination across different focal lengths to ensure the environment consistently feels oppressive and dark."
                ],
                "confidence": "high"
              },
              {
                "element_id": "vertical_hanging_curtain",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A long, hanging curtain is positioned towards the right side of the room. It hangs straight down, remaining mostly in shadow and acting as a dark, vertical boundary within the dim space.",
                "applies_to_shots": [
                  6,
                  9
                ],
                "source_facts": [
                  "far curtain at frame center-right (Shot 6)",
                  "the curtain only a soft vertical smear at the right edge (Shot 9)"
                ],
                "visual_inferences": [
                  "The curtain is drawn heavily, concealing the space behind it and forming a distinct vertical line in the background geometry."
                ],
                "creative_decisions": [
                  "Kept the curtain aligned on the right edge of the frame to anchor spatial continuity between the wide floor shot and the tight facial close-up."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 6,
                "ref_usage": "exact_background",
                "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": "54f43cfe2d0cd315"
      },
      {
        "scene_index": 12,
        "heading": "S#12. 옥탑방 안 / N",
        "beat_title": "붉은 원형 표식의 발현",
        "representative_moment": "A fresh, wet red circular mark (P01) dominates the pale wall above the shadowed bed, illuminated by a chilling gray-green light.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low-angle close composition toward the wall, cold gray-green tint with a sickly red highlight on the wet pigment",
            "t2i_prompt": "Photorealistic cinematic still. [L05: a pale, stained flat wall facing the camera at an upward angle, anchored at the lower frame edge by the dark, rumpled top edge of a shadowed bed]. Focus tightly on P01, a fresh, wet, deep red circular mark painted on the wall, positioned in the upper-center frame. The circular mark catches a sickly red sheen as if lit from within the wet pigment. C01O02 in a dark activewear jacket, young East Asian woman, appears as a softly blurred shoulder slice entering the left frame edge in partial visibility, facing toward the wall. Cold, low-key lighting with a gray-green tint falls across the wall surface. Deep, muted shadows dominate the frame edges, casting a chilling, underlit darkness over the immediate space.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "침대 위 벽에 붉은 원이 생겨난다 (마치 누군가 붓으로 벽에 원으로 그리는 것처럼).",
              "red circular mark centered and occupying roughly one-third of the frame",
              "bed’s dark top edge anchors the lower frame"
            ],
            "visual_inferences": [
              "fixed_element cold_dim_bedroom_lighting: cold, low-key lighting with a gray-green tint, deep muted shadows",
              "The mark looks like wet paint, catching its own internal-like reflection against the dim room"
            ],
            "creative_decisions": [
              "Restricted the background reference entirely per skipped_close_framing rule, describing only the immediate wall surface and bed edge in an [L05: ...] block.",
              "Included C01O02 as a soft-focus shoulder slice at the frame edge to satisfy character presence requirements without violating the primary subject focus on the wall mark."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "b12bae52b16d2601",
              "owned_hash": "b0bfa88101c56b24",
              "camera_direction_hash": "cabb3eb5b9681d50",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Exact background location from Scene 12 Shot 9, but processed under skipped_close_framing mode to restrict the environment purely to the immediate wall and bed edge.",
        "_shot_index": 16,
        "visible_entities": [
          "C01",
          "P10",
          "P03",
          "P04",
          "P01",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 16
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the side of the bed at eye height, settle out of the upward tilt into a steady CU with a low angle toward the wall above the bed, keeping the red circular mark centered and occupying roughly one-third of the frame. In omniscient direct vision, the bed’s dark top edge anchors the lower frame while the paint-like circle appears freshly wet on the upper wall, clear but not oversized, as if the room itself has become evidence.",
            "lighting_mood": "The room remains cold and underlit, but the circular mark catches a sickly red sheen as if lit from within the wet pigment.",
            "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",
              "P10",
              "P03",
              "P04",
              "P01",
              "L05"
            ],
            "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": "cb_daughter_room_night_body_red_mark",
            "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_dim_bedroom_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the bedroom is immersed in a cold, low-key lighting with a gray-green tint. Deep, muted shadows dominate the space, casting a chilling, underlit darkness over the room's surroundings.",
                "applies_to_shots": [
                  6,
                  9,
                  16
                ],
                "source_facts": [
                  "Low-key room light and spill from the living room flatten into a cold gray-green darkness (Shot 6)",
                  "room collapses into a dark blur, gray-pale against muted shadows (Shot 9)",
                  "The room remains cold and underlit (Shot 16)"
                ],
                "visual_inferences": [
                  "A persistent eerie, desaturated color palette unifies the grim discovery sequence regardless of camera angle."
                ],
                "creative_decisions": [
                  "Maintained consistent background illumination across different focal lengths to ensure the environment consistently feels oppressive and dark."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 9,
                "ref_usage": "exact_background",
                "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": "77b398c6424a4124"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "충격과 패닉의 도주",
        "representative_moment": "어두운 옥탑방 문턱을 벗어나며 비명을 지르는 수리영(C01)의 일그러진 상체.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Handheld low angle, tight upper-torso composition, cold night lighting",
            "t2i_prompt": "Photorealistic cinematic still. Seen from a low angle slightly tilted upward, C01O02 in a dark activity jacket, young Korean woman with long black hair, leans forward through the threshold at a three-quarter angle from the right, her upper torso and head occupying the center frame. Her mouth is open in a scream, showing variant features carried from stable_traits—dark eyes wide and fixed on the void. Focus on her pale, distressed expression framed by the surrounding darkness. Cold exterior night light skims her cheek and jawline, leaving the opposite side of her face in shadow. [L11: chipped concrete doorframe pressing tightly along the left and right edges like a trap, damp stained exterior wall texture, the interior space immediately behind the figure receding into unreadable opaque black negative space].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Suri-young screams and runs out of the rooftop room",
              "DP instruction: handheld MCU with a low angle, slightly tilted up at Suri-young as she leans out of the black doorway",
              "DP instruction: cold exterior night light skims her face"
            ],
            "visual_inferences": [
              "pose: three_quarter_right, leaning through doorway",
              "eyes fixed on the void, indicating shock",
              "tight framing omits lower body and isolates the upper torso against the frame edges"
            ],
            "creative_decisions": [
              "using the [L11] block to define the frame-edge doorframe and exterior wall, adhering to skipped_close_framing rules without referencing the room interior",
              "emphasizing the opaque black negative space behind her to isolate the panic"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "b2431eb557a9b0d4",
              "owned_hash": "a3c134dc147c7de6",
              "camera_direction_hash": "315504d8629740a5",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "동일한 공간(옥탑방)의 연장선이나, 이 샷은 close framing으로 인해 내부 레이아웃이 배제되고 문틀 구조와 어둠만으로 연결됨",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "L11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just outside the rooftop room threshold, use a handheld MCU with a low angle, slightly tilted up at 수리영 as she leans out of the black doorway within arm’s length of the lens. The tight frame cuts her at the upper torso, the doorframe pressing along both edges like a trap, while her open mouth sits high center and the dark room behind her remains unreadable.",
            "lighting_mood": "Cold exterior night light skims her face while the doorway behind her stays nearly black, heightening the scream with wet concrete grays.",
            "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",
              "L11"
            ],
            "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": "cb_stairs_night_police_arrival_sirens",
            "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": 11,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "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": "b59d67b4ece99213"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "충격적인 소식을 마주하는 혜수",
        "representative_moment": "경찰차에서 내리며 멍한 수리영을 발견한 혜수(C02)의 굳은 표정.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low-to-medium Dutch angle medium shot, high contrast noir lighting with pulsing red-blue reflections",
            "t2i_prompt": "Photorealistic cinematic still. Low-to-medium Dutch angle framing. C02O03 in a dark detective coat, an East Asian middle-aged woman with dark hair and mature facial features, caught in mid-motion stepping out. She is positioned at a three-quarter left angle, one foot landing firmly on the wet asphalt from the reference at the bottom edge of the frame, her torso extending upward with her face occupying the upper-right third. Her eyes are fixed intensely on someone off-screen to the left. The open car door from the reference remains on frame left, forming a dark vertical wing just behind her shoulder. The background street from the reference is enveloped in a blue-black mist. Red and blue glow from the police lightbar from the reference reflects heavily on the damp ground, while cool colored ambient light washes the side of her face, giving her a hard, damp edge against the sodium streetlight haze. Focus on her tense mid-stride posture and hardened expression reacting to the off-screen figure.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "Shot 3 framing: 'At street level beside the patrol car... catching 혜수 three-quarter front as one foot lands on the wet asphalt and the open car door remains on frame left.'",
              "Shot 3 lighting: 'Blue-red police flicker cuts through sodium streetlight haze, giving 혜수’s face a hard, damp, noir edge.'",
              "Shot 3 action: 'her hardened face is held in the upper-right third as she notices 수리영 off-screen.'"
            ],
            "visual_inferences": [
              "fixed_element wet_street_with_police_lights: The ground is wet asphalt thatslickly reflects surrounding light sources, heavily illuminated by red and blue emergency lights.",
              "C02 stable traits applied: Korean 중년 여성, 검은 머리, 성숙한 얼굴선 mapped to 'East Asian middle-aged woman with dark hair and mature facial features'.",
              "Frame edge geometry: With a low-to-medium camera, the foot landing on the asphalt occupies the bottom edge, allowing the torso and face to reach the upper frame."
            ],
            "creative_decisions": [
              "Explicitly anchored owned objects ('wet asphalt from the reference', 'car door from the reference') to ensure strict background binding without generating duplicate props.",
              "Employed a Dutch angle to visually translate the suddenness and disorienting shock of the moment.",
              "Used the car door to create a strong vertical framing element on the left, pushing the viewer's focus to her face in the upper-right third."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "0c0bc0dc6f4e4fa0",
              "owned_hash": "a3c134dc147c7de6",
              "camera_direction_hash": "a7f538e541ca34d9",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "The open car door from the reference",
                  "reason": "The prompt explicitly anchors the door to the reference, so it is treated as an existing background object rather than a newly drawn one.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "street",
                  "violating_phrase": "The background street from the reference",
                  "reason": "The street is explicitly referenced as already present in the background, not requested as a new addition.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "lightbar",
                  "violating_phrase": "the police lightbar from the reference",
                  "reason": "The lightbar is described as coming from the reference, which makes it an anchored existing object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pavement",
                  "violating_phrase": "wet asphalt from the reference",
                  "reason": "This refers to existing ground surface in the reference context and does not direct a new redraw of the pavement.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "L11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "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 street level beside the patrol car, hold a static MWS in a Dutch angle from low-to-medium height, catching 혜수 three-quarter front as one foot lands on the wet asphalt and the open car door remains on frame left. The door forms a dark vertical wing behind her shoulder, while her hardened face is held in the upper-right third as she notices 수리영 off-screen.",
            "lighting_mood": "Blue-red police flicker cuts through sodium streetlight haze, giving 혜수’s face a hard, damp, noir 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": [
              "C02",
              "L11"
            ],
            "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": "background_ref_attached",
            "bg_id": "cb_stairs_night_police_arrival_sirens",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "barred window",
              "building",
              "courtyard",
              "door",
              "drain grate",
              "landing",
              "lightbar",
              "pavement",
              "pedestrian gate",
              "planter",
              "police car",
              "sliding gate",
              "stair",
              "storage box",
              "street",
              "utility meter",
              "wall",
              "wall light",
              "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": "wet_street_with_police_lights",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark nighttime street environment enveloped in a blue-black mist. The ground consists of wet asphalt that slickly reflects surrounding light sources. The area is heavily illuminated by the harsh, flashing red and blue emergency lights of a nearby police vehicle, creating pulsing reflections across the damp surfaces.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "source_facts": [
                  "Shot 3 lighting: 'Blue-red police flicker cuts through sodium streetlight haze'",
                  "Shot 3 framing: 'one foot lands on the wet asphalt'",
                  "Shot 6 lighting: 'Wet police-light reflections tremble... blue-black mist and muted red pulses'"
                ],
                "visual_inferences": [
                  "The street level remains persistently damp, with the patrol car's flashing emergency lights dominating the ambient lighting of the scene."
                ],
                "creative_decisions": [
                  "Used the combination of wet asphalt and pulsing red-blue police lights as a continuous atmospheric anchor to unify the street-level 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": "C02O03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "cb_stairs_night_police_arrival_sirens",
                "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": "9e0858a004b69075"
      },
      {
        "scene_index": 13,
        "heading": "S#13. 옥탑방 외곽 / N",
        "beat_title": "충격적 진실",
        "representative_moment": "수리영이 눈물이 고인 눈으로 자신을 붙잡은 혜수를 멍하게 올려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up (ECU) over-the-shoulder with shallow DOF, eye-level, dark blue-black mist and pulsing red-blue lighting",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the tear-filled, dark eyes of a young Korean woman with long black hair facing the camera, her soft facial features captured in a blank upward stare. In the left foreground, the heavily blurred shoulder and cheek edge of a middle-aged Korean woman form a tight over-the-shoulder composition, her out-of-focus hands gripping the young woman's shoulders. Wet red and blue police-light reflections tremble across the young woman's eyes and damp skin. [L11: A dark, shallow-focus background enveloped in thick blue-black mist, illuminated by muted, pulsing red and blue emergency light spill]",
            "outfit_assignments": [],
            "source_facts": [
              "S#13 action: '초점을 잃고 멍하니 서있는 수리영의 모습을 발견하고 달려간다. ... (올라다보며)'",
              "Shot 6 framing: 'push into an extreme close-up (ECU) over 혜수’s shoulder... 혜수 is reduced to a blurred shoulder'",
              "Shot 6 lighting: 'Wet police-light reflections tremble in 수리영’s eyes, while the rest of the frame sinks into blue-black mist and muted red pulses.'"
            ],
            "visual_inferences": [
              "fixed_element wet_street_with_police_lights: The damp street atmosphere and pulsing emergency lights dictate the reflections on the subject's face",
              "Hyesu's grip on Suriyoung is visible as blurred foreground hands anchoring the two characters in the shared space"
            ],
            "creative_decisions": [
              "Utilized the 'Focus on' trigger to enforce body-part focus on the eyes, safely bypassing the C## injection to prevent face-body separation in an ECU framing",
              "Described the foreground shoulder and grip to create a claustrophobic OTS tension"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "4c6e31272ab20ad9",
              "owned_hash": "a3c134dc147c7de6",
              "camera_direction_hash": "d9ce932d0302e2ad",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 13,
        "dependency_reason": "S13_Shot3의 경찰차 불빛과 푸른 안개 환경(wet_street_with_police_lights) 연속성 유지",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "C02",
          "L11"
        ],
        "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": "At 수리영’s eye level, push into an extreme close-up (ECU) over 혜수’s shoulder, using an eye-level OTS with shallow DOF until 수리영’s tear-filled eyes occupy the central band of the frame. 혜수 is reduced to a blurred shoulder and cheek edge along the left foreground, making the shot feel like we are trapped inside the space between her grip and 수리영’s blank upward stare.",
            "lighting_mood": "Wet police-light reflections tremble in 수리영’s eyes, while the rest of the frame sinks into blue-black mist and muted red pulses.",
            "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",
              "L11"
            ],
            "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": "skipped_close_framing",
            "bg_id": "cb_stairs_night_police_arrival_sirens",
            "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_street_with_police_lights",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark nighttime street environment enveloped in a blue-black mist. The ground consists of wet asphalt that slickly reflects surrounding light sources. The area is heavily illuminated by the harsh, flashing red and blue emergency lights of a nearby police vehicle, creating pulsing reflections across the damp surfaces.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "source_facts": [
                  "Shot 3 lighting: 'Blue-red police flicker cuts through sodium streetlight haze'",
                  "Shot 3 framing: 'one foot lands on the wet asphalt'",
                  "Shot 6 lighting: 'Wet police-light reflections tremble... blue-black mist and muted red pulses'"
                ],
                "visual_inferences": [
                  "The street level remains persistently damp, with the patrol car's flashing emergency lights dominating the ambient lighting of the scene."
                ],
                "creative_decisions": [
                  "Used the combination of wet asphalt and pulsing red-blue police lights as a continuous atmospheric anchor to unify the street-level shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 13,
                "shot_index": 3,
                "ref_usage": "exact_background",
                "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": [
              {
                "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": "321d385543665b7a"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "사라진 시신과 핏자국",
        "representative_moment": "관찰자의 시선에서 바라본, 핏자국과 시신이 감쪽같이 사라진 소름 끼치게 깨끗한 방 안 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Symmetrical EWS at eye-level from just outside the threshold, cold sterile gray-blue night light.",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the unnaturally clean room interior from an eye-level observer perspective just outside the open door from the reference. The bare wooden floor from the reference stretches out smoothly across the lower half, perfectly spotless and devoid of any bloodstains. To one side, the neatly made bed from the reference and pillow from the reference sit quietly against the flat wall from the reference. On the far wall, the window curtain from the reference hangs perfectly still. On the floor, a dark-colored backpack from the reference with a small plush toy from the reference dangling from its zipper rests completely stationary. The entire space is bathed in a cold, sterile gray-blue night light, emphasizing the eerie absence.",
            "outfit_assignments": [],
            "source_facts": [
              "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
              "침대 위에 붉은 표식은 물론 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
              "수리영 방안에 놓여진 백팩, 인형."
            ],
            "visual_inferences": [
              "fixed_element spotless_clean_bedroom: cold, sterile gray-blue night light emphasizing unnatural emptiness",
              "fixed_element backpack_with_plush_doll: rests quietly on the floor, completely stationary",
              "observer POV looking through the doorway, no character visible in the frame"
            ],
            "creative_decisions": [
              "Symmetrical wide framing from outside the threshold to maximize the feeling of an empty, unnervingly clean space.",
              "Explicitly anchoring all owned background objects with 'from the reference' to prevent duplicate rendering over the exact background image."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a486fb9bbfdd6830",
              "owned_hash": "5ba936e2b10f2eb0",
              "camera_direction_hash": "675e9d76016c947d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "just outside the open door from the reference",
                  "reason": "The door is mentioned only as an existing reference anchor for viewpoint and is not the direct object of a redraw verb.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "bare wooden floor from the reference stretches out",
                  "reason": "The floor is described as an existing reference element with spatial/visual context, not something explicitly created or modified.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bed",
                  "violating_phrase": "the neatly made bed from the reference",
                  "reason": "The bed is referenced as already present in the scene and only described with state/placement details.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pillow",
                  "violating_phrase": "pillow from the reference sit quietly",
                  "reason": "The pillow is an existing reference object mentioned without any explicit redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "against the flat wall from the reference",
                  "reason": "The wall is used as a positional anchor for the bed and is not targeted by a redraw verb.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "curtain",
                  "violating_phrase": "window curtain from the reference hangs",
                  "reason": "The curtain is described as an existing referenced object with a hanging state, which is anchor-style mention rather than redraw intent.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "backpack",
                  "violating_phrase": "a dark-colored backpack from the reference",
                  "reason": "The backpack is explicitly tied to the reference and only described, not newly generated or altered.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "toy",
                  "violating_phrase": "plush toy from the reference dangling",
                  "reason": "The toy is presented as a referenced existing object with a positional relation, not as a newly created object.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "S12_Shot6의 수리영 방 배경(exact_background)을 그대로 유지하며, 이전 사건의 흔적이 사라진 깨끗한 상태를 대조적으로 묘사.",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "P05",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From just outside the bedroom threshold, hold a symmetrical EWS at eye-level, wider than the flow default, centered on the unnaturally clean room interior. In direct observer vision, the spotless floor stretches empty through the lower half, the made bed sits to one side, and the curtain hangs perfectly still where the body should have been, emphasizing absence rather than action.",
            "lighting_mood": "Sterile gray-blue night light replaces the earlier red horror, making the room feel too clean and airless.",
            "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",
              "L05"
            ],
            "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": "cb_daughter_room_night_clean_reset",
            "reference_usage": "exact_background",
            "owned_objects": [
              "backpack",
              "bed",
              "curtain",
              "door",
              "floor",
              "photograph",
              "pillow",
              "sliding window",
              "toy",
              "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": "spotless_clean_bedroom",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the bedroom is disturbingly spotless and meticulously clean, completely devoid of any bloodstains or disorder. The bare wooden floor stretches out smoothly, while a neatly made bed sits quietly alongside a perfectly still window curtain. The entire room is bathed in a cold, sterile gray-blue night light, emphasizing the unnatural emptiness.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
                  "침대 위에 붉은 표식은 물론 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
                  "Shot 4: spotless floor stretches empty... made bed sits to one side, and the curtain hangs perfectly still",
                  "Shot 4 lighting: Sterile gray-blue night light",
                  "Shot 5 lighting: A cold overhead spill"
                ],
                "visual_inferences": [
                  "The stark cleanliness creates an eerie, almost artificial neatness.",
                  "A bare wooden floor maximizes the impression of an unblemished surface."
                ],
                "creative_decisions": [
                  "Emphasizing the absence of the previously seen horror by rendering the room as aggressively mundane, illuminated by a chilling blue-toned wash."
                ],
                "confidence": "high"
              },
              {
                "element_id": "backpack_with_plush_doll",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A casual, dark-colored backpack with a small plush doll dangling from its zipper. It rests quietly on the floor, completely stationary, serving as a subtle reminder of ordinary life amidst the unsettling environment.",
                "applies_to_shots": [
                  4,
                  5,
                  9
                ],
                "source_facts": [
                  "수리영 방안에 놓여진 백팩, 인형.",
                  "Listed as an appearing element across Shots 4, 5, and 9."
                ],
                "visual_inferences": [
                  "The backpack sits motionless on the floor.",
                  "The attached plush doll hangs limply, offering a slight contrast to the otherwise sterile room."
                ],
                "creative_decisions": [
                  "Using the displaced backpack as a constant visual anchor across the different angles and rooms to unify the location's underlying tension."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 6,
                "ref_usage": "exact_background",
                "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": "cb_daughter_room_night_clean_reset",
                "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": "b73fcf8039a6ca9e"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "핏자국이 사라진 깨끗한 방을 확인하고 충격에 빠진 수리영",
        "representative_moment": "C01 looks down at the spotless floor in disbelief, her pale face illuminated by a cold overhead spill.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low-angle tight MCU, sterile gray-blue color temperature",
            "t2i_prompt": "Photorealistic cinematic still. A low-angle MCU with the camera near the ground, [L05: a disturbingly spotless, dry wooden floor surface stretching across the immediate lower foreground, fading into a soft, sterile dark void behind]. C01O02 in a dark jacket, an East Asian young woman with long black hair, a soft facial shape, and dark eyes, leans forward into a head-and-shoulder composition. Her pale face occupies the upper-right portion of the frame at three-quarter left, neck and shoulder edge visible. Her eyes are fixed down on the clean wooden surface. A cold overhead spill washes her face and shoulder, leaving no red accents, while dim ambient fill preserves her body volume against the background shadow. Focus on her pale expression and the unblemished floorboards immediately below her.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
              "얼굴이 파리해지는 수리영. ‘어----?’ ‘분명히 봤는데...’",
              "Shot 5: 핏자국 하나 없는 깨끗한 방바닥을 믿을 수 없다는 듯 내려다보는 수리영의 창백한 얼굴."
            ],
            "visual_inferences": [
              "fixed_element spotless_clean_bedroom implies an unnaturally bare, dry wooden floor without any marks.",
              "The low angle emphasizes her shock as she searches the empty floor right in front of her."
            ],
            "creative_decisions": [
              "Used a tight low-angle MCU to capture both her pale face in the upper right frame and the spotless floor in the lower foreground, omitting the rest of the room as per close framing policy.",
              "Cold overhead lighting washes her skin tone to accentuate the sterile, unblemished nature of the space."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "ee203a145bbf3db3",
              "owned_hash": "5ba936e2b10f2eb0",
              "camera_direction_hash": "288567c68a0a265f",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "Same location as the prior shot, but background reference is explicitly skipped and omitted due to the tight close-up framing rule.",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "P05",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the bedroom beside the clean floor, begin with a spotless floor detail and tilt up into a tight MCU at a low angle, ending on 수리영’s pale face as she looks down in disbelief. The floor remains in the lower foreground as a clean, empty plane, while her face enters the upper-right portion of frame, the tilt tightening the emotional contradiction between what she saw and what exists now.",
            "lighting_mood": "A cold overhead spill washes her face almost colorless, with no red accent left except the memory implied by the empty 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": [
              "C01",
              "P05",
              "L05"
            ],
            "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": "cb_daughter_room_night_clean_reset",
            "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_clean_bedroom",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the bedroom is disturbingly spotless and meticulously clean, completely devoid of any bloodstains or disorder. The bare wooden floor stretches out smoothly, while a neatly made bed sits quietly alongside a perfectly still window curtain. The entire room is bathed in a cold, sterile gray-blue night light, emphasizing the unnatural emptiness.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "지나칠 정도로 깨끗하게 정돈된 방안. 핏자국도 보이지 않고",
                  "침대 위에 붉은 표식은 물론 커튼 뒤의 시신도 감쪽 같이 사라졌다.",
                  "Shot 4: spotless floor stretches empty... made bed sits to one side, and the curtain hangs perfectly still",
                  "Shot 4 lighting: Sterile gray-blue night light",
                  "Shot 5 lighting: A cold overhead spill"
                ],
                "visual_inferences": [
                  "The stark cleanliness creates an eerie, almost artificial neatness.",
                  "A bare wooden floor maximizes the impression of an unblemished surface."
                ],
                "creative_decisions": [
                  "Emphasizing the absence of the previously seen horror by rendering the room as aggressively mundane, illuminated by a chilling blue-toned wash."
                ],
                "confidence": "high"
              },
              {
                "element_id": "backpack_with_plush_doll",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A casual, dark-colored backpack with a small plush doll dangling from its zipper. It rests quietly on the floor, completely stationary, serving as a subtle reminder of ordinary life amidst the unsettling environment.",
                "applies_to_shots": [
                  4,
                  5,
                  9
                ],
                "source_facts": [
                  "수리영 방안에 놓여진 백팩, 인형.",
                  "Listed as an appearing element across Shots 4, 5, and 9."
                ],
                "visual_inferences": [
                  "The backpack sits motionless on the floor.",
                  "The attached plush doll hangs limply, offering a slight contrast to the otherwise sterile room."
                ],
                "creative_decisions": [
                  "Using the displaced backpack as a constant visual anchor across the different angles and rooms to unify the location's underlying tension."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "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": "a1928b1be57265ee"
      },
      {
        "scene_index": 14,
        "heading": "S#14. 옥탑방 안 / N",
        "beat_title": "사라진 시신과 흔들리는 현실",
        "representative_moment": "혜수가 고개 숙인 수리영의 양어깨를 두 손으로 꽉 감싸 쥐고, 긴장된 분위기 속에서 그녀를 응시하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Frontal MCU at chest height with muted lamp glow and low-key shadows",
            "t2i_prompt": "Photorealistic cinematic still. Frontal MCU at chest height. C02O03 in a dark jacket, a middle-aged Korean woman with black hair, mature facial lines, and sharp eyes, facing the camera, her upper body braced forward in the center frame. Her hands are locked tightly around the shoulders of C01O02 in a casual jacket, a young Korean woman with long black hair and soft facial structure, positioned slightly lower at three-quarter angle from the right. C01O02's head is bowed inward, looking down with her dark eyes directed downward, contained between C02O03's arms. C02O03's eyes are fixed on C01O02's bowed head. Focus on the tense grip of C02O03's hands on C01O02's shoulders, visually conveying a claustrophobic restraint. Muted lamp glow and faint TV spill pool softly on their upper bodies, contrasting with the dark, low-key shadows holding the scene. [L05: a dim damp-toned wall and a blurred edge of a dining table serving as the immediate backdrop directly behind their shoulders].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#14 옥탑방 안: 수리영 어깨를 어루만지며 혜수 대사",
              "Shot 9 description: 고개를 숙인 수리영의 양어깨를 두 손으로 꽉 감싸 쥔 혜수의 상체 정면"
            ],
            "visual_inferences": [
              "The grip acts as both comfort and physical restraint, adding psychological tension",
              "fixed_element backpack_with_plush_doll is excluded from the frame because a chest-height MCU focuses tightly on the upper bodies and shoulders, leaving the floor out of bounds"
            ],
            "creative_decisions": [
              "Kept both characters on the same axis to emphasize the physical trap-like feeling of Hye-su's embrace",
              "Utilized [L05: ...] frame-edge blocking to omit the broader room background in compliance with the skipped_close_framing policy"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d6b7508fd150bc79",
              "owned_hash": "052e7e8396b50472",
              "camera_direction_hash": "5c788ba234ec6005",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "Same room as Shot 5, but close framing omits the background reference, focusing only on the immediate upper-body interaction.",
        "_shot_index": 9,
        "visible_entities": [
          "C02",
          "C01",
          "P05",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "In the main room, dolly into a frontal MCU at chest height, keeping 혜수’s hands locked around 수리영’s shoulders in the near foreground of the composition. The camera holds their upper bodies on the same axis: 혜수 centered and braced forward, 수리영 slightly lower with her bowed head contained between 혜수’s arms, turning comfort into restraint.",
            "lighting_mood": "Muted lamp glow and faint TV spill soften the room, but the low-key shadows keep 혜수’s grip visually tense and claustrophobic.",
            "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",
              "C01",
              "P05",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "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": "cb_living_night_clean_reset",
            "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": "backpack_with_plush_doll",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A casual, dark-colored backpack with a small plush doll dangling from its zipper. It rests quietly on the floor, completely stationary, serving as a subtle reminder of ordinary life amidst the unsettling environment.",
                "applies_to_shots": [
                  4,
                  5,
                  9
                ],
                "source_facts": [
                  "수리영 방안에 놓여진 백팩, 인형.",
                  "Listed as an appearing element across Shots 4, 5, and 9."
                ],
                "visual_inferences": [
                  "The backpack sits motionless on the floor.",
                  "The attached plush doll hangs limply, offering a slight contrast to the otherwise sterile room."
                ],
                "creative_decisions": [
                  "Using the displaced backpack as a constant visual anchor across the different angles and rooms to unify the location's underlying tension."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 5,
                "ref_usage": "exact_background",
                "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": "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": "ce510af0af73c9fc"
      },
      {
        "scene_index": 15,
        "heading": "해안가. 버스정류장 부근 / N",
        "beat_title": "집으로 달려가기로 한 결심",
        "representative_moment": "벤치에서 벌떡 일어나 어둠 속 어딘가를 응시하는 수리영의 굳건한 얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "In front of the bench, tight MCU at eye-level, nearly frontal, cold sodium light and misty blue ambient.",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in a dark hooded activity jacket, a Korean young woman, captured in a tight eye-level medium close-up with shoulders and upper chest in frame. Focusing on her determined expression, she stands fully upright, facing the camera with her back to an empty wet bench. Her eyes are fixed on the distant darkness, dark eyes clearly visible. Cold coastal sodium light and misty blue ambient glow wash across her cheek and shoulder, while faint red tail-light glints reflect on the damp bus-stop glass at the side edge. [L12: A dark seaside bus stop at night, the surrounding air thick with cold sea mist, misty blue shadows pooling on the wet ground.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#15 action: '(훅 일어나며) 집에 가봐야 겠어.'",
              "Shot 3 observer POV: 'just risen from bench, facing the camera, eyes distant'",
              "lighting description mentions cold coastal sodium light, misty blue shadows, and distant red tail-light glints"
            ],
            "visual_inferences": [
              "fixed_element: coastal_bus_stop_environment (wet ground, damp glass panels, blue-tinted shadows, cold sea mist)",
              "C01's dark eyes from entity stable_traits injected into the description",
              "tight MCU composition includes her shoulders and upper chest to ground the figure in the environment"
            ],
            "creative_decisions": [
              "sodium light and misty blue ambient wash across her cheek rather than cutting her face, avoiding structural dismemberment phrasing",
              "damp bus-stop glass explicitly placed at the side edge to frame the reflection without dominating the composition",
              "background bench placed behind her to anchor the physical space despite the close framing"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "410b36e6283dd718",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "63b4a90dde95adec",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "Not directly dependent on a prior scene's visuals, though utilizing internal shot consistency for the bus stop environment.",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "In front of the seaside bus-stop bench, push into a tight MCU at eye-level as 수리영 is already fully upright, her determined expression filling most of the center frame without losing the bench and dark shoreline behind her. The composition is nearly frontal for the resolve beat, with her shoulders squared toward the road and the damp bus-stop glass forming a faint reflective plane along the side.",
            "lighting_mood": "Cold coastal sodium light and misty blue shadows carve her face, with only faint distant red tail-light glints cutting the 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": [
              "C01",
              "L12"
            ],
            "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": [
              {
                "element_id": "coastal_bus_stop_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark seaside bus stop at night, featuring a bench and damp glass panels. The surrounding air is thick with cold sea mist. The area is illuminated by low-key sodium streetlights, casting misty blue shadows across the wet ground and surfaces.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "source_facts": [
                  "Location: L12 (해안가 버스정류장 부근)",
                  "Shot 3 mentions 'seaside bus-stop bench', 'damp bus-stop glass', 'cold coastal sodium light and misty blue shadows'.",
                  "Shot 5 mentions 'bus stop bench', 'wet coastal road', 'low-key sodium streetlight mixes with cold sea mist'."
                ],
                "visual_inferences": [
                  "The ground and glass panels remain visibly wet and damp throughout, reflecting the muted sodium streetlights."
                ],
                "creative_decisions": [
                  "Consistently apply a foggy, dark coastal atmosphere with blue-tinted shadows to emphasize isolation and coldness across both 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"
              }
            ],
            "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": "7dc6aba6c2c6c4c6"
      },
      {
        "scene_index": 15,
        "heading": "S#15. 해안가. 버스정류장 부근 / N",
        "beat_title": "혜수의 외침과 멀어지는 수리영",
        "representative_moment": "C02가 입에 손을 모으고 소리치며, 그 너머로 멀어지는 C01의 뒷모습이 아웃포커스로 보인다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level framing from the chest up, shallow depth of field, low-key sodium lighting with blue-black haze.",
            "t2i_prompt": "Photorealistic cinematic still. Shot from eye-level with a shallow depth of field. C02O03 in a dark coat, a Korean middle-aged woman with black hair, mature facial lines, and distinct eyes, occupies the sharp left foreground from the chest up. She stands in right profile, one hand firmly cupped at her mouth mid-shout, eyes fixed on the distant figure. In the soft, out-of-focus right background, C01O02 in a hooded activewear jacket, a Korean young woman with long black hair, appears as a small figure with her back to the camera. She is frozen mid-stride running away, one foot just lifted off the ground, her jacket flowing back in the direction opposite to her motion. The two figures share the wet coastal road stretching between them as a spatial anchor, set against [L12: a dark seaside bus stop environment at night, featuring a damp bench at the frame edge and dim glass panels]. The low-key sodium streetlight mixes with the cold sea mist, leaving C02O03's features in muted shadow while the background road fades into a deep blue-black haze.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S15 action: 혜수 shouts at 수리영's back as she runs away.",
              "Shot 5 describes 혜수 stopping in the foreground, hands cupped to shout, with 수리영 as a small running figure in the distance."
            ],
            "visual_inferences": [
              "fixed_element: coastal_bus_stop_environment (wet coastal road, cold sea mist, sodium streetlights).",
              "C01's running motion is frozen mid-stride to capture the instantaneous moment.",
              "C02's framing captures her from the chest up to emphasize her reaction while keeping the background context."
            ],
            "creative_decisions": [
              "Applied a shallow depth of field to render C01 as a soft background element, adhering to the close framing rules for the primary subject (C02).",
              "Explicitly named 'the wet coastal road stretching between them' to satisfy the shared spatial anchor rule for foreground/background separation.",
              "Used low-key lighting and blue-black haze to enhance the eerie, isolated coastal atmosphere."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "41a81bcf2380ad42",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "cba7d6cc05ae797d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 15,
        "dependency_reason": "Shot 3의 해안가 버스정류장 배경 요소(exact_background) 연속성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "C02",
          "L12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the bus stop bench position, an eye-level MCU holds slightly behind and to the side of 혜수, using a shallow DOF as she occupies the sharp left foreground from chest up with one hand cupped at her mouth. The camera inherits the pan’s stopped midpoint: the wet coastal road opens diagonally behind her, and 수리영 is a small, softened figure running away in the right-background distance.",
            "lighting_mood": "Low-key sodium streetlight mixes with cold sea mist, leaving 혜수’s face muted while the road falls into blue-black 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",
              "C02",
              "L12"
            ],
            "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": "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": "coastal_bus_stop_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark seaside bus stop at night, featuring a bench and damp glass panels. The surrounding air is thick with cold sea mist. The area is illuminated by low-key sodium streetlights, casting misty blue shadows across the wet ground and surfaces.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "source_facts": [
                  "Location: L12 (해안가 버스정류장 부근)",
                  "Shot 3 mentions 'seaside bus-stop bench', 'damp bus-stop glass', 'cold coastal sodium light and misty blue shadows'.",
                  "Shot 5 mentions 'bus stop bench', 'wet coastal road', 'low-key sodium streetlight mixes with cold sea mist'."
                ],
                "visual_inferences": [
                  "The ground and glass panels remain visibly wet and damp throughout, reflecting the muted sodium streetlights."
                ],
                "creative_decisions": [
                  "Consistently apply a foggy, dark coastal atmosphere with blue-tinted shadows to emphasize isolation and coldness across both shots."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 15,
                "shot_index": 3,
                "ref_usage": "exact_background",
                "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": [
              {
                "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": "9d66f0c4f073fc7c"
      },
      {
        "scene_index": 16,
        "heading": "S#16. 경찰서 사무실 / N",
        "beat_title": "불길한 예감과 위치추적 요구",
        "representative_moment": "김형사의 시야 정면으로 전화번호가 뜬 스마트폰 화면을 들이민 혜수의 손 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A subjective POV ECU from a seated eye line, lens just above monitor height, cold fluorescent light with screen glow.",
            "t2i_prompt": "Photorealistic cinematic still. Subjective POV extreme close-up from a seated eye line behind a desk, lens just above monitor height. Close on a Korean middle-aged woman's hand extending from the left, firmly holding a smartphone directed toward the camera. The hand is wrapped in a dark jacket sleeve. Tight focus on the glowing smartphone screen displaying a contact number, taking the strongest visual weight in the center frame. Cold fluorescent light is undercut by the pale glow of the phone screen reflecting on the fingers. In the immediate lower foreground, the blurred top edge of a dark-colored computer monitor and the edge of the desk form dim horizontal borders. [L13: Soft, out-of-focus dim office partitions and faint fluorescent reflections create a shallow depth of field behind the hand].",
            "outfit_assignments": [],
            "source_facts": [
              "S#16 action: '(핸드폰에 저장된 민숙번호 보여주며) 이 번호 위치 좀 따봐.'",
              "shot description: 김형사의 시야 정면으로 민숙의 전화번호가 뜬 스마트폰 화면을 들이민 혜수의 손 클로즈업."
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: hand holding phone in subjective POV",
              "fixed_element office_desk_monitor: top edge and desk edge form foreground boundary",
              "shallow depth of field highlighting the glowing screen",
              "cold police office lighting mixed with pale screen glow"
            ],
            "creative_decisions": [
              "utilized body-part focus rule ('Close on') to avoid phantom face rendering, replacing C02O03 with common noun and demographic descriptor",
              "anchored the POV perspective by placing the blurred monitor top edge at the bottom of the frame",
              "used [L13] to describe the out-of-focus background surface due to close framing skipping the background reference"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "d36cf221c582f380",
              "owned_hash": "88d6c6cc6ee9f273",
              "camera_direction_hash": "74f1ba95eccafe7a",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No previous scene reference specified for strict dependency.",
        "_shot_index": 3,
        "visible_entities": [
          "C02",
          "C05",
          "P03",
          "L13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "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 김형사 subjective POV ECU from his seated eye line behind the desk, lens just above monitor height, fixes on 혜수’s hand thrusting a smartphone toward him; the phone screen sits centered and tight, taking the strongest visual weight without exceeding a natural prop scale. The glowing contact entry for 민숙 is sharp, while the desk edge and monitor top form dim horizontal borders around the frame.",
            "lighting_mood": "Cold fluorescent police-office light is undercut by the phone’s pale glow, giving the evidence a sickly 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": [
              "C02",
              "C05",
              "P03",
              "L13"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C05",
                "outlook_id": "O07"
              }
            ],
            "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": "office_desk_monitor",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A dark-colored computer monitor sitting on an office desk. It is positioned as a physical barrier between the seated viewer behind the desk and anyone standing on the opposite side. The top and side edges of the monitor frequently occupy the lower and lateral foreground of the frame.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "source_facts": [
                  "Shot 3: lens just above monitor height, desk edge and monitor top form dim horizontal borders around the frame.",
                  "Shot 5: two blurred monitor edges in the foreground, leans over the monitor symmetrically."
                ],
                "visual_inferences": [
                  "standard dark plastic casing for an office computer monitor",
                  "placed squarely in front of the seated officer"
                ],
                "creative_decisions": [
                  "using the monitor as a blurred foreground framing device (through-object composition) to anchor the subjective seated POV and emphasize the barricade-like feeling of the desk"
                ],
                "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": "C05O07",
                "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": "66a5899e750211c1"
      },
      {
        "scene_index": 16,
        "heading": "S#16. 경찰서 사무실 / N",
        "beat_title": "위치추적을 강권하는 혜수의 확신",
        "representative_moment": "모니터 양옆을 짚고 몸을 숙여 김형사를 강하게 압박하는 혜수의 정면 시점.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "subjective seated POV, low angle medium shot, flat green-white fluorescent lighting with colder monitor underlight",
            "t2i_prompt": "Photorealistic cinematic still. From a subjective seated POV, a low angle medium shot looking up slightly. C02O03 in a dark jacket, a middle-aged Korean woman with black hair, mature facial contours, and sharp eyes, occupies the center frame. She is positioned behind the dark-colored computer monitor from the reference, whose blurred top edge and side bezels facing the camera occupy the lower foreground, acting as a visual barrier with the screen mostly hidden. The cluttered office desk from the reference serves as a physical support below her. C02O03 is facing the camera, her upper body extending toward the upper frame edge as she leans forward symmetrically over the monitor, both hands planted firmly on the desk near the monitor's sides. Her eyes are fixed intensely on the camera. Sharp focus highlights her urgent expression and tense posture. Flat green-white ambient light from the ceiling fluorescents casts deep shadows under her eyes, while a cool glow from the hidden monitor screen reflects a colder underlight onto her lower face. The exact background from the prior shot is preserved, with closed dull metal filing cabinets from the reference visible in the depth behind her.",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "Scene 16 action: 혜수가 불길한 예감을 느끼고 위치추적을 압박함.",
              "Shot 5 description: 책상 위 모니터 양옆을 두 손으로 짚은 채 심각한 눈빛으로 김형사를 압박하듯 내려다보는 혜수의 정면."
            ],
            "visual_inferences": [
              "fixed_element office_desk_monitor: monitor acts as a physical barrier occupying the lower foreground",
              "subjective seated POV logically excludes the seated observer (Detective Kim) from the frame",
              "low angle looking up places her upper body towards the top of the frame and the desk in the lower frame"
            ],
            "creative_decisions": [
              "through-object composition with blurred monitor edges to anchor the seated POV",
              "changed 'carve dark hollows' to 'casts deep shadows' to strictly avoid physical cutting verbs on body parts",
              "flat fluorescent lighting contrasted with cold monitor underlight to emphasize urgency and tension"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "43672f094b98e64c",
              "owned_hash": "88d6c6cc6ee9f273",
              "camera_direction_hash": "e77f63361f3dba20",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "monitor",
                  "violating_phrase": "dark-colored computer monitor from the reference",
                  "reason": "The monitor is explicitly described as being from the reference, so it is being used as an anchored existing object rather than newly created or modified.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "desk",
                  "violating_phrase": "cluttered office desk from the reference",
                  "reason": "The desk is explicitly tied to the reference, indicating an existing background object rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "filing cabinet",
                  "violating_phrase": "closed dull metal filing cabinets from the reference",
                  "reason": "The filing cabinets are described as preserved from the prior shot/reference, so this is an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "Shot 3의 경찰서 내부 공간(배경) 구조와 책상 위 모니터의 배치를 동일하게 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C02",
          "C05",
          "P03",
          "L13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "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 the same seated 김형사 POV, a low angle MS frames 혜수 between the two blurred monitor edges in the foreground, using a through-object composition that makes the desk feel like a barricade. She leans over the monitor symmetrically, both hands planted near its sides, staring down into the lens as if pressing 김형사 into action.",
            "lighting_mood": "Flat green-white fluorescents carve dark hollows under 혜수’s eyes, with the monitor spill adding a colder underlight to her urgent face.",
            "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",
              "C05",
              "P03",
              "L13"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              },
              {
                "character_id": "C05",
                "outlook_id": "O07"
              }
            ],
            "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": [
              "box",
              "case board",
              "chair",
              "clock",
              "computer",
              "console",
              "copier",
              "desk",
              "door",
              "filing cabinet",
              "folder",
              "monitor",
              "photograph",
              "printer",
              "radio",
              "telephone",
              "tray",
              "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": "office_desk_monitor",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A dark-colored computer monitor sitting on an office desk. It is positioned as a physical barrier between the seated viewer behind the desk and anyone standing on the opposite side. The top and side edges of the monitor frequently occupy the lower and lateral foreground of the frame.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "source_facts": [
                  "Shot 3: lens just above monitor height, desk edge and monitor top form dim horizontal borders around the frame.",
                  "Shot 5: two blurred monitor edges in the foreground, leans over the monitor symmetrically."
                ],
                "visual_inferences": [
                  "standard dark plastic casing for an office computer monitor",
                  "placed squarely in front of the seated officer"
                ],
                "creative_decisions": [
                  "using the monitor as a blurred foreground framing device (through-object composition) to anchor the subjective seated POV and emphasize the barricade-like feeling of the desk"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "shot_index": 3,
                "ref_usage": "exact_background",
                "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": "C05O07",
                "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": "ec2e7b164dc8d923"
      },
      {
        "scene_index": 17,
        "heading": "S#17. 옥탑방 / 동틀무렵",
        "beat_title": "고요한 새벽과 붉은 기운의 전조",
        "representative_moment": "푸른 새벽빛 속, 불이 켜진 옥탑방 창문이 고요하게 빛나는 외관 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme wide low angle, blue predawn ambient light with a single warm focal point",
            "t2i_prompt": "Photorealistic cinematic still. A static extreme wide shot, low angle from across the roofs, the camera positioned slightly below the window height, keeping the architecture small inside a wide frame. Focus on the closed, warmly lit window from the reference sitting off-center against damp, stained concrete. Blue predawn ambient light swallows the exterior, casting wet, cool shadows over the parapet wall from the reference in the lower foreground. The water tank and utility pipe from the reference stand silhouetted against a mist-heavy, blue-gray dawn sky. A tiny silhouette of a black cat pauses on the distant edge of the wall. Thin graphic lines of TV antennas cut through the upper atmospheric space, the entire scene held unnervingly still.",
            "outfit_assignments": [],
            "source_facts": [
              "S#17 action: '새벽녘, 고양이 울음소리... 불이 켜져 있는 옥탑 방'",
              "shot description: A static EWS low angle watches the old rooftop room from across the roofs, slightly below the lit window height",
              "lighting: Blue predawn ambient light swallows the rooftop while the single warm window glows like an exposed nerve"
            ],
            "visual_inferences": [
              "No human characters present in this frame",
              "Black cat is rendered as a small silhouette to maintain the EWS scale",
              "The scene captures the exact instantaneous moment before the cat jumps over the wall"
            ],
            "creative_decisions": [
              "Anchored 'window', 'parapet wall', 'water tank', and 'utility pipe' explicitly with 'from the reference' to satisfy background_binding.owned_objects constraint",
              "Placed the parapet wall in the lower foreground to geometrically match the low-angle perspective"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "9b553cc35775c7e1",
              "owned_hash": "de6f1110b77a4310",
              "camera_direction_hash": "804551a6df170434",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "window",
                  "violating_phrase": "the closed, warmly lit window from the reference",
                  "reason": "The prompt explicitly references the existing window from the reference, so it is an anchor reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "parapet wall",
                  "violating_phrase": "the parapet wall from the reference",
                  "reason": "The parapet wall is mentioned as part of the referenced background and framed in the scene, not explicitly created or modified.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "utility pipe",
                  "violating_phrase": "The water tank and utility pipe from the reference",
                  "reason": "The utility pipe is cited as an existing referenced object in the background, which makes this an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "water tank",
                  "violating_phrase": "The water tank and utility pipe from the reference",
                  "reason": "The water tank is cited as an existing referenced object in the background, which makes this an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 10,
        "dependency_reason": "S10_Shot5의 옥탑방 배경(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": "A static EWS low angle watches the old rooftop room from across the roofs, slightly below the lit window height, keeping the architecture small inside a wide blue dawn frame. The warm window sits off-center against damp concrete, antennas, and low parapets, held unnervingly still before any lateral movement begins.",
            "lighting_mood": "Blue predawn ambient light swallows the rooftop while the single warm window glows like an exposed nerve.",
            "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": "cb_rooftop_predawn_light_on",
            "reference_usage": "exact_background",
            "owned_objects": [
              "clothesline",
              "deck",
              "door",
              "parapet wall",
              "platform",
              "post",
              "roof drain",
              "stairwell bulkhead",
              "utility pipe",
              "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": [],
            "previous_shot_refs": [
              {
                "scene_index": 10,
                "shot_index": 5,
                "ref_usage": "exact_background",
                "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_rooftop_predawn_light_on",
                "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": "b8b6154716556591"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "고양이 소리에 놀라 깨어난 수리영",
        "representative_moment": "C01이 번쩍 눈을 뜨고 고개를 치켜든 채 굳은 표정으로 카메라 왼쪽 너머를 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Handheld eye-level close-up, front-left angle, shallow depth of field, cool daylight",
            "t2i_prompt": "Photorealistic cinematic still. A handheld eye-level close-up composition with shallow depth of field. C01O02 in a dark jacket, a Korean young woman with long black hair, a soft facial contour, and dark eyes, is captured at a three-quarter angle from the right. Her head is paused mid-lift, snapping awake abruptly, her rigid features occupying the center-right of the frame with her neck and shoulder visible. Her wide eyes are fixed intensely toward the unseen space beyond the camera-left direction. The camera tightly frames her tense, abruptly awakened state. Cool daylight washes across her cheek, casting muted gray shadows and draining warmth from her complexion. [L05: A rumpled pillow edge blurs softly at the bottom frame, while a dim, pale wall stretches out of focus directly behind her.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S18 action: '고양이 울음소리에 번쩍 눈을 뜨고'",
              "shot description: '번쩍 뜬 눈으로 고개를 치켜든 수리영의 잔뜩 굳은 얼굴'",
              "DP instruction: 'eyes→bedroom door (closed door beyond camera-left direction)'",
              "DP instruction: 'three_quarter_right, head snapping awake'"
            ],
            "visual_inferences": [
              "fixed_element cool_daylight_apartment_interior: cool daylight, muted gray shadows",
              "mid-lift pose to physically manifest the snapping awake action without motion blur"
            ],
            "creative_decisions": [
              "shallow depth of field to isolate her sudden panic and keep the background suppressed",
              "placed her face slightly off-center right to visually balance her intense gaze directed to the left",
              "used L05 frame-edge description to imply the bed setting without triggering a full room background generation"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "8947d169e0125491",
              "owned_hash": "0ad90dcb6c66fe5a",
              "camera_direction_hash": "b7edabd6380f77e0",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "exact_background: 유지해야 할 옥탑방 내부의 서늘하고 정돈된 낮 시간대 조명 톤 (배경 요소 자체는 close framing으로 생략됨)",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "P05",
          "P03",
          "P01",
          "P08",
          "L05"
        ],
        "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": "A handheld CU at eye-level stays low beside the bed, within arm’s length of 수리영, tightening on her rigid face as her eyes snap open and her head lifts. The bed and pillow are reduced to soft edges at the bottom of frame, while her face sits slightly right of center from a front-left angle, trapped in shallow DOF.",
            "lighting_mood": "Thin daylight leaks into a low-key room, leaving her skin cool and gray with tremulous handheld 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": [
              "C01",
              "P05",
              "P03",
              "P01",
              "P08",
              "L05"
            ],
            "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": "cb_master_bedroom_dawn_waiting_empty",
            "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": [
              {
                "applies_to_shots": [
                  2,
                  14
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Keep the apartment scenes visually unified with a cool, exposed daytime palette despite the change from bedside framing to dining-table framing."
                ],
                "description": "Cool daylight lies over the apartment interior, draining warmth from skin tones and leaving muted gray shadows. The room should feel quiet, low-key, and visually restrained, with no warm practical light dominating the frame.",
                "element_id": "cool_daylight_apartment_interior",
                "element_type": "environment_state",
                "source_facts": [
                  "Shot 2 lighting: 'Thin daylight leaks into a low-key room, leaving her skin cool and gray.'",
                  "Shot 14 lighting: 'Cool daylight and muted apartment shadows make her fear feel exposed.'"
                ],
                "visual_inferences": []
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 9,
                "ref_usage": "exact_background",
                "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": "3b8c0cffa02761d1"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "거울 속 기괴한 붉은 원 환각",
        "representative_moment": "거울 안쪽으로 반사된 타일 벽면에 거대한 P01(붉은 원형 표식)이 맺혀 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static Dutch angle close-up, cold flat lighting",
            "t2i_prompt": "Photorealistic cinematic still. A static Dutch angle close-up. Focus on P01, a sudden, vivid, wet-looking red circular mark burning unnaturally saturated within the reflection. [L05: A slightly fogged bathroom mirror plane with faint water specks, dominating the frame and reflecting a pale, clean tile wall distorted by the haze, while a wet, white porcelain sink rim barely grazes the lower frame edge for scale.] Cold light flattens the reflected tiles, making the vivid hallucinated mark feel detached from physical space.",
            "outfit_assignments": [],
            "source_facts": [
              "S18 action: '거울에 비친 욕실 벽에 갑자기 또 발생하는 붉은 원.'",
              "shot description: subjective perception through reflection where the reflected tiles dominate and a large red circular mark appears."
            ],
            "visual_inferences": [
              "cold bathroom light flattening the pale tiles",
              "red mark appearing unnaturally wet and saturated as a hallucinated focal point"
            ],
            "creative_decisions": [
              "omitted any physical character to strictly maintain the subjective POV",
              "composed the frame intimately close to the mirror plane, using only the sink edge at the bottom for geometric scale"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "aa371b65edec4d0a",
              "owned_hash": "6c35426d65c6ece5",
              "camera_direction_hash": "4094be44d5b7915d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "atmosphere_reference to carry the prior shot's tense and unnerving tone",
        "_shot_index": 10,
        "visible_entities": [
          "P05",
          "P03",
          "P01",
          "P08",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static Dutch angle CU presses close to the bathroom mirror plane, composing only the reflected tile wall where a large red circular mark appears, with the sink edge barely grazing the lower frame for scale. This is 수리영’s subjective perception through reflection: the real room is displaced, the reflected tiles dominate, and the apparition feels detached from physical space.",
            "lighting_mood": "Cold bathroom light flattens the tiles while the red mark burns unnaturally saturated, signaling a hallucinated reflection.",
            "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",
              "P03",
              "P01",
              "P08",
              "L05"
            ],
            "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": "skipped_close_framing",
            "bg_id": "cb_bathroom_day_mirror_red_mark_vision",
            "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": 18,
                "shot_index": 2,
                "ref_usage": "atmosphere_reference",
                "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": [],
            "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": "4d73b667915094ea"
      },
      {
        "scene_index": 18,
        "heading": "S#18. 안방 안 / D",
        "beat_title": "환각에 시달리는 수리영",
        "representative_moment": "식탁 위 액자 앞에서 양 뺨을 꽉 감싸 쥔 채 겁에 질려 얼어붙은 수리영.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A static eye-level tight frontal composition with cool, draining daylight",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level observer's view creates a tight frontal composition at the dining table. C01O02 in a casual top, a young Korean woman with long black hair, facing the camera, upper chest and shoulders visible. Her hands are tightly clamped to both cheeks, her expression frozen in terror. Her eyes, with a faint golden shimmer carried from stable_traits, look down, fixed on P08, a photo frame standing upright near the camera axis in the lower foreground, its front glass angled slightly toward the camera. Focus on her terrified expression, anchoring the emotional center. Cool daylight washes over the dining table, leaving hard reflections on the surface separating her and the camera, and falls on her skin, draining warmth into muted gray shadows. [L05: the soft background recedes into stiff, over-clean domestic lines, featuring out-of-focus pushed-in chair backs angled toward the camera, keeping the room quiet and visually restrained].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S18 action: '(자신의 뺨을 치며) 정신 차려 수리영!' -> interpreted as holding cheeks in terror after the hallucination",
              "S18 shot description: 액자 앞에서 양손으로 자신의 양 뺨을 꽉 감싸 쥔 채 겁에 질려 얼어붙은 수리영의 정면",
              "Shot 18, Beat 3: She is at the dining table, reacting to the distorted photo hallucination"
            ],
            "visual_inferences": [
              "fixed_element cool_daylight_apartment_interior: cool daylight draining warmth, muted gray shadows",
              "P08 is placed in the lower foreground to establish the trigger of her hallucination",
              "The dining table creates a spatial separation between the camera and the character"
            ],
            "creative_decisions": [
              "A tight eye-level frontal framing centers the character's terror while keeping the upper chest in frame to adhere to close framing face phrasing rules",
              "Cool daylight and restrained background lines contrast with her internal panic",
              "Soft focus on the background chair backs enhances the close framing effect and anchors the space without referencing a prior background image"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e6d3f5cfb7debff7",
              "owned_hash": "d7adc39a19f9f935",
              "camera_direction_hash": "cf111baa49197294",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "Same apartment location as the prior S18 shot, maintaining consistent lighting and structural mood despite being a new instantaneous moment with skipped background reference.",
        "_shot_index": 14,
        "visible_entities": [
          "C01",
          "P05",
          "P03",
          "P01",
          "P08",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static MCU eye-level holds a tight frontal composition at the dining table, with 수리영 centered and the photo frame near the camera axis in the lower foreground. Her hands clamped to both cheeks become the emotional center, while the rest of the apartment recedes into stiff, over-clean domestic lines after the hallucination.",
            "lighting_mood": "Cool daylight and muted apartment shadows make her fear feel exposed, with only a faint residual red unease implied by the photo’s position.",
            "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",
              "P03",
              "P01",
              "P08",
              "L05"
            ],
            "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": "cb_living_day_photo_vision",
            "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": [
              {
                "applies_to_shots": [
                  2,
                  14
                ],
                "character_name": "",
                "confidence": "high",
                "creative_decisions": [
                  "Keep the apartment scenes visually unified with a cool, exposed daytime palette despite the change from bedside framing to dining-table framing."
                ],
                "description": "Cool daylight lies over the apartment interior, draining warmth from skin tones and leaving muted gray shadows. The room should feel quiet, low-key, and visually restrained, with no warm practical light dominating the frame.",
                "element_id": "cool_daylight_apartment_interior",
                "element_type": "environment_state",
                "source_facts": [
                  "Shot 2 lighting: 'Thin daylight leaks into a low-key room, leaving her skin cool and gray.'",
                  "Shot 14 lighting: 'Cool daylight and muted apartment shadows make her fear feel exposed.'"
                ],
                "visual_inferences": []
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "shot_index": 10,
                "ref_usage": "exact_background",
                "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": "1d15694b86d1bb9a"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "단서 추적 전의 멈칫함",
        "representative_moment": "이른 아침 한산한 마트 입구 앞, 수리영(C01)이 시선을 떨군 채 자전거 핸들을 양손으로 꽉 쥐고 멈춰 서 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A static eye-level medium framing facing the subject head-on, with muted early-morning gray light and a damp blue cast.",
            "t2i_prompt": "Photorealistic cinematic still. C01O02 in dark activity wear, a Korean young woman in her 20s with long black hair, soft facial features, and dark eyes, facing the camera, looking down. The bicycle handlebars cut across the lower foreground as a tense horizontal line, gripped tightly by her hands, the bicycle frame and front wheel visible below. She stands outside the storefront from the reference, the sliding door directly behind her. Muted early-morning gray light and a cold, damp blue ambient haze wash across her figure, creating an uneasy mood. Focus on her downcast expression and the tension in her posture.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Scene heading: S#19 마트 / D",
              "Scene text: 이른 아침, 아직은 한산한 마트 안. 자전거를 주차하고 안으로 들어가는 수리영.",
              "Shot description: A static eye-level MWS faces 수리영 head-on outside the quiet mart entrance, with the glass doors directly behind her... white-knuckled grip... eyes down."
            ],
            "visual_inferences": [
              "fixed_element mart_exterior_environment: The exterior surroundings of a local mart during an overcast early morning. Enveloped in a cold, damp, muted gray and blue ambient haze.",
              "Suri-young's downcast eyes and tight grip on the stationary bicycle indicate her internal tension and hesitation before entering to search for clues."
            ],
            "creative_decisions": [
              "Eye-level medium framing places her in the center with the storefront directly behind, anchoring the location.",
              "The bicycle handlebars act as a visual horizontal barrier in the lower foreground to emphasize her paused state.",
              "Muted gray light and damp blue cast emphasize the quiet, uneasy early morning atmosphere."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "33e1d9cc5b99fc26",
              "owned_hash": "aa09dcc0158b9ca2",
              "camera_direction_hash": "2e58f127d93cb26c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "sliding door",
                  "violating_phrase": "the sliding door directly behind her",
                  "reason": "The phrase mentions the existing sliding door as a background anchor and does not instruct to create, add, or modify it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "storefront",
                  "violating_phrase": "She stands outside the storefront from the reference",
                  "reason": "The phrase explicitly anchors the storefront to the reference instead of requesting a new storefront to be drawn.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "exact_background ref_usage: same exterior location (mart storefront), preserving established background environment",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "P03",
          "L09",
          "L10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static eye-level MWS faces 수리영 head-on outside the quiet mart entrance, placing her center frame with the glass doors directly behind her. The bicycle handlebars cut across the lower foreground as a tense horizontal line, while her white-knuckled grip is emphasized without letting the bicycle overpower the frame.",
            "lighting_mood": "Muted early-morning gray light flattens the storefront, with a damp blue cast keeping the empty mart uneasy rather than ordinary.",
            "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",
              "P03",
              "L09",
              "L10"
            ],
            "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_entrance_exterior_morning_quiet_cctv_visible",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "awning",
              "bollard",
              "curb",
              "sidewalk",
              "sliding door",
              "storefront",
              "street",
              "streetlamp",
              "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": "mart_exterior_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior surroundings of a local mart during an overcast early morning. The setting features stained concrete walls and a storefront area, enveloped in a cold, damp, muted gray and blue ambient haze.",
                "applies_to_shots": [
                  1,
                  4,
                  6
                ],
                "source_facts": [
                  "Scene heading: S#19 마트 / D",
                  "Scene text: 이른 아침, 아직은 한산한 마트 안 / 마트 밖",
                  "Shot 1: Muted early-morning gray light, damp blue cast, storefront",
                  "Shot 4: Overcast morning light, cold concrete pallor, stained exterior wall",
                  "Shot 6: cold morning haze, mart wall"
                ],
                "visual_inferences": [
                  "Consistent concrete texture and a cool, damp color palette connect the different angles of the mart's exterior structure."
                ],
                "creative_decisions": [
                  "Unified the lighting atmosphere with a tense blue/gray overcast tone to ground all exterior shots in the same early morning temporal continuity."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 5,
                "ref_usage": "exact_background",
                "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_entrance_exterior_morning_quiet_cctv_visible",
                "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": "df6c0fe7d6d47135"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "CCTV 위치 확인",
        "representative_moment": "A mart employee points upward at the CCTV camera mounted on the exterior wall.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low angle side composition, cold concrete pallor",
            "t2i_prompt": "Photorealistic cinematic still. A low angle observer positioned beside the stained concrete wall. An East Asian middle-aged man in a practical worker uniform stands in left profile, his torso and lower body occupying the left side of the frame. His arm is raised, pointing diagonally upward toward the CCTV camera from the reference positioned high in the upper right frame, his eyes fixed on the device. The overcast morning light falls on the wall giving it a cold concrete pallor, enveloping the space in a damp, muted gray and blue ambient haze. A small hard highlight reflects on the casing of the CCTV camera.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene text: 마트 밖 / 엄마와 남자 직원CCTV 위치를 확인하다. 찍혔을 만한 위치다.",
              "Shot 4 description: 남자직원의 측면, 외벽 위쪽에 달린 CCTV 카메라를 손가락으로 가리킨 채 멈춰 선 상태",
              "Camera direction: A static low angle from beside the mart wall holds 남자직원 in side profile, his raised arm forming a diagonal line up to the CCTV camera mounted high above him."
            ],
            "visual_inferences": [
              "fixed_element mart_exterior_environment: Overcast early morning, stained concrete walls, cold damp gray/blue haze.",
              "The mart employee is treated as an unregistered extra and represented with a common noun and demographic descriptor as he has no entity ID."
            ],
            "creative_decisions": [
              "Positioned the figure's torso on the left and the referenced CCTV on the upper right to create a readable diagonal composition.",
              "Applied a specific highlight on the CCTV casing to emphasize it against the muted, overcast background."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "8638f53a7672f758",
              "owned_hash": "aa09dcc0158b9ca2",
              "camera_direction_hash": "02dd29e0cb76da64",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "CCTV camera",
                  "violating_phrase": "the CCTV camera from the reference positioned high in the upper right frame",
                  "reason": "The owned object is explicitly referenced as coming from the reference and positioned in the frame, which is an anchor/reference description rather than a directive to redraw it.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 19,
        "dependency_reason": "Shares the overcast early morning exterior atmosphere established in the prior shots.",
        "_shot_index": 4,
        "visible_entities": [
          "P03",
          "L09",
          "L10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static MS low angle from beside the mart wall holds 남자직원 in side profile, his raised arm forming a diagonal line up to the CCTV camera mounted high above him. The frame keeps his torso on the left and the CCTV on the upper right, making the surveillance angle visually readable against the stained exterior wall.",
            "lighting_mood": "Overcast morning light gives the wall a cold concrete pallor, while the CCTV casing catches a small hard highlight like an unblinking 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": [
              "P03",
              "L09",
              "L10"
            ],
            "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_entrance_exterior_morning_quiet_cctv_visible",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "awning",
              "bollard",
              "curb",
              "sidewalk",
              "sliding door",
              "storefront",
              "street",
              "streetlamp",
              "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": "mart_exterior_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior surroundings of a local mart during an overcast early morning. The setting features stained concrete walls and a storefront area, enveloped in a cold, damp, muted gray and blue ambient haze.",
                "applies_to_shots": [
                  1,
                  4,
                  6
                ],
                "source_facts": [
                  "Scene heading: S#19 마트 / D",
                  "Scene text: 이른 아침, 아직은 한산한 마트 안 / 마트 밖",
                  "Shot 1: Muted early-morning gray light, damp blue cast, storefront",
                  "Shot 4: Overcast morning light, cold concrete pallor, stained exterior wall",
                  "Shot 6: cold morning haze, mart wall"
                ],
                "visual_inferences": [
                  "Consistent concrete texture and a cool, damp color palette connect the different angles of the mart's exterior structure."
                ],
                "creative_decisions": [
                  "Unified the lighting atmosphere with a tense blue/gray overcast tone to ground all exterior shots in the same early morning temporal continuity."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 19,
                "shot_index": 1,
                "ref_usage": "atmosphere_reference",
                "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": "bg_entrance_exterior_morning_quiet_cctv_visible",
                "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": "ef6532575bf703c0"
      },
      {
        "scene_index": 19,
        "heading": "S#19. 마트 / D",
        "beat_title": "CCTV 위치 확인 및 보고",
        "representative_moment": "수리영(C01)이 마트 밖 가로등 아래서 스마트폰을 귀에 대고 혜수에게 상황을 보고하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static MCU low angle, tense desaturated glow",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the same figure, C01O02 in a dark jacket, a young Korean woman with long black hair, soft facial contours, and dark eyes. Positioned at a three-quarter angle from the left, she is captured in a static medium close-up from a low observer angle, upper body in frame. She presses P03 tightly to her ear, her eyes fixed on the distant space. A narrow streetlight pole forms a vertical line behind one shoulder. The weak streetlight mixes with a damp, muted gray and blue haze, washing her cheek and the phone in a tense, desaturated glow. Her form is anchored against [L10: a cold, stained concrete exterior wall surface receding just beyond her shoulder], isolating her completely from the out-of-focus background.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Scene heading: S#19 마트 / D",
              "Scene text: 마트 밖 ... 수리영, 혜수에게 전화 걸어 상황을 설명한다.",
              "Shot 6 description: 수리영이 마트 밖 가로등 아래서 스마트폰을 귀에 바짝 대고 있다."
            ],
            "visual_inferences": [
              "fixed_element mart_exterior_environment: cold, damp, muted gray and blue ambient haze, stained concrete walls",
              "Streetlight pole acting as a vertical frame line behind her shoulder",
              "MCU low angle focuses on the tense communication via P03"
            ],
            "creative_decisions": [
              "Desaturated lighting and muted background color palette to emphasize the cold, early-morning atmosphere",
              "Close framing omits the broader street context, anchoring the subject firmly to the immediate concrete wall surface via L10"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "e02fe79555049c1a",
              "owned_hash": "aa09dcc0158b9ca2",
              "camera_direction_hash": "310c5b38758111d0",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "continuity requires preserving the same environment as S8_Shot5 via zoom_in_detail usage",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "P03",
          "L09",
          "L10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static MCU low angle sits under the streetlight about four feet from 수리영, slightly off-center in front of her upper body as she presses the smartphone tight to her ear. The mart wall and street space shrink into blurred context behind her, while the streetlight pole forms a narrow vertical behind one shoulder.",
            "lighting_mood": "The weak streetlight mixes with cold morning haze, outlining 수리영’s cheek and phone in a tense, desaturated 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",
              "P03",
              "L09",
              "L10"
            ],
            "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_entrance_exterior_morning_quiet_cctv_visible",
            "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": "mart_exterior_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior surroundings of a local mart during an overcast early morning. The setting features stained concrete walls and a storefront area, enveloped in a cold, damp, muted gray and blue ambient haze.",
                "applies_to_shots": [
                  1,
                  4,
                  6
                ],
                "source_facts": [
                  "Scene heading: S#19 마트 / D",
                  "Scene text: 이른 아침, 아직은 한산한 마트 안 / 마트 밖",
                  "Shot 1: Muted early-morning gray light, damp blue cast, storefront",
                  "Shot 4: Overcast morning light, cold concrete pallor, stained exterior wall",
                  "Shot 6: cold morning haze, mart wall"
                ],
                "visual_inferences": [
                  "Consistent concrete texture and a cool, damp color palette connect the different angles of the mart's exterior structure."
                ],
                "creative_decisions": [
                  "Unified the lighting atmosphere with a tense blue/gray overcast tone to ground all exterior shots in the same early morning temporal continuity."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 5,
                "ref_usage": "zoom_in_detail",
                "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": "aa50f370a652f45d"
      },
      {
        "scene_index": 20,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "식별 불가능한 단서 앞에서의 불안",
        "representative_moment": "C01 craning her neck over the security employee's shoulder to stare intensely at the out-of-frame monitor.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "over-the-shoulder close framing from behind and slightly above, low-key green-gray fluorescent mixed with cold blue-green monitor glow",
            "t2i_prompt": "Photorealistic cinematic still. Shot from behind and slightly above, using an over-the-shoulder composition. An adult Korean male in a dark security uniform, with back to camera, hunched forward, occupies the left foreground as a dark block. Beyond him in the center-right frame, C01O02 in a dark activity jacket, a Korean young woman carrying features from stable_traits — long black hair, soft facial structure, and dark eyes. She is at a three-quarter angle from the right, neck craned forward over the male figure's shoulder, eyes fixed on the low monitor surface out of frame. Focus on her strained expression. A cold blue-green glow from the desk monitor pools on her face and neck, mixing with low-key fluorescent ambient light to leave damp-looking shadows and a muted green-gray palette. [L14: A dull gray, poorly lit wall fills the background edge].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#20 action: CCTV화면을 돌려보는 보안팀 직원... 뒤에서 초조한 모습으로 화면을 주시하는 수리영",
              "shot description: 보안팀 직원 등 뒤에서 모니터 화면을 향해 목을 길게 뺀 수리영의 초조한 얼굴."
            ],
            "visual_inferences": [
              "fixed_element security_monitor_desk: monitor emits a prominent, cold blue-green glow that casts light on the surrounding area",
              "fixed_element office_lighting_environment: dim and underexposed, muted green-gray color palette, damp-looking shadows"
            ],
            "creative_decisions": [
              "Utilized the male employee's back as a heavy foreground block on the left to frame C01 and enhance the claustrophobic tension.",
              "Reflected the cold blue-green monitor glow tightly onto C01's face to emphasize her anxiety and the focus on the unreadable screen."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "b324d928d339110d",
              "owned_hash": "aedb005298c78a71",
              "camera_direction_hash": "e092460da8db5e6d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L14"
        ],
        "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 behind and slightly above the male security employee's right shoulder, the camera holds a tight MCU with a subtle high angle, using an OTS foreground block: his dark back occupies the left foreground while 수리영's strained face is framed beyond him near center-right. The monitor sits low in the middle ground, angled away from camera, and 수리영 leans into its glow as if trying to force the darkness on the CCTV to clarify.",
            "lighting_mood": "Low-key fluorescent office light mixes with the cold monitor glow, leaving damp-looking shadows and a muted green-gray palette.",
            "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"
              }
            ],
            "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_security_office_day_cctv_dark_section",
            "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": "security_monitor_desk",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A security monitor sits low on an office desk. The screen emits a prominent, cold blue-green glow that casts light on the surrounding area. Faint red interface LEDs are glowing on the console equipment nearby.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "source_facts": [
                  "Shot 2: The monitor sits low in the middle ground, angled away from camera.",
                  "Shot 5: the monitor receding behind him... monitor adding a weak blue-green rim and no warmth except faint red interface LEDs."
                ],
                "visual_inferences": [
                  "The desk is a standard, utilitarian office desk used for security monitoring."
                ],
                "creative_decisions": [
                  "Positioning the monitor so it acts as a functional practical light source, casting a cool rim light on the characters nearby."
                ],
                "confidence": "high"
              },
              {
                "element_id": "office_lighting_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the administrative office is dim and underexposed. The overhead lighting consists of flat, low-key institutional fluorescent fixtures that create a muted green-gray color palette and cast damp-looking, harsh shadows across the room.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "source_facts": [
                  "Shot 2: Low-key fluorescent office light mixes with the cold monitor glow, leaving damp-looking shadows and a muted green-gray palette.",
                  "Shot 5: Flat institutional fluorescents are underexposed... and no warmth."
                ],
                "visual_inferences": [
                  "The room lacks any warm natural light, contributing to a cold and slightly oppressive back-room atmosphere."
                ],
                "creative_decisions": [
                  "Keeping the overall environment underexposed to emphasize the characters' anxiety and focus the viewer's attention on the glow of the monitor."
                ],
                "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": "7461f5fb015cb88d"
      },
      {
        "scene_index": 20,
        "heading": "S#20. 마트 총무과 / 실내",
        "beat_title": "CCTV 복사본 요청에 동의하는 보안직원",
        "representative_moment": "혜수의 어깨 너머로, 모니터 불빛을 받으며 고개를 돌려 동의를 표하는 남자 직원의 얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "MCU at eye-level, over-the-shoulder composition, underexposed dim lighting with cold blue-green monitor glow",
            "t2i_prompt": "Photorealistic cinematic still. MCU at eye-level, over-the-shoulder composition. An Asian man in a security worker uniform occupies the center-left in sharp focus, turning his head to a three-quarter angle from the left, his eyes fixed on the figure in the foreground. In the right foreground, C02O03 in a dark jacket, a Korean middle-aged woman, leans toward the shared office desk with her back to camera, her shoulder and mature facial contour edge soft and out of focus, her eyes fixed on the man. Focus on the man's face turning away from the console. The security monitor sits low on the desk receding behind him, emitting a prominent cold blue-green glow that reflects as a weak rim light on his jawline and the desk surface, alongside faint red interface LEDs. The overhead flat institutional fluorescents are underexposed, leaving damp-looking harsh shadows. [L14: a scuffed gray plastic desk partition edge and closed dusty office blinds forming a muted green-gray soft background].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#20 action: 혜수가 어제 CCTV 전체 복사를 요청하자 보안직원이 그러자고 대답함.",
              "Shot 5: 혜수 쪽으로 고개를 돌린 보안팀 직원의 동의하는 표정."
            ],
            "visual_inferences": [
              "fixed_element security_monitor_desk",
              "fixed_element office_lighting_environment",
              "The security employee is an unregistered extra, depicted as an Asian man in a security worker uniform.",
              "Hye-soo acts as a soft OTS frame in the right foreground."
            ],
            "creative_decisions": [
              "Over-the-shoulder framing to establish the spatial relationship over the shared office desk anchor.",
              "Using the monitor's blue-green glow as a functional rim light to emphasize the employee's expression against the underexposed background."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "252a613562b49fde",
              "owned_hash": "aedb005298c78a71",
              "camera_direction_hash": "361547f6284dbb04",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "S20_Shot2의 이전 배경 설정을 따르되, close framing 정책에 따라 배경 reference를 제외하고 frame-edge 요소만으로 묘사",
        "_shot_index": 5,
        "visible_entities": [
          "C02",
          "L14"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "After the pan completes, the camera holds a steady MCU at eye-level near 혜수's sightline, angled three-quarters onto the male security employee's face as he turns toward her to agree. 혜수's shoulder and cheek edge remain soft in the right foreground as an OTS frame, while the employee occupies the center-left with the monitor now receding behind him.",
            "lighting_mood": "Flat institutional fluorescents are underexposed, with the monitor adding a weak blue-green rim and no warmth except faint red interface LEDs.",
            "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",
              "L14"
            ],
            "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": "bg_security_office_day_cctv_dark_section",
            "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": "security_monitor_desk",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A security monitor sits low on an office desk. The screen emits a prominent, cold blue-green glow that casts light on the surrounding area. Faint red interface LEDs are glowing on the console equipment nearby.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "source_facts": [
                  "Shot 2: The monitor sits low in the middle ground, angled away from camera.",
                  "Shot 5: the monitor receding behind him... monitor adding a weak blue-green rim and no warmth except faint red interface LEDs."
                ],
                "visual_inferences": [
                  "The desk is a standard, utilitarian office desk used for security monitoring."
                ],
                "creative_decisions": [
                  "Positioning the monitor so it acts as a functional practical light source, casting a cool rim light on the characters nearby."
                ],
                "confidence": "high"
              },
              {
                "element_id": "office_lighting_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the administrative office is dim and underexposed. The overhead lighting consists of flat, low-key institutional fluorescent fixtures that create a muted green-gray color palette and cast damp-looking, harsh shadows across the room.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "source_facts": [
                  "Shot 2: Low-key fluorescent office light mixes with the cold monitor glow, leaving damp-looking shadows and a muted green-gray palette.",
                  "Shot 5: Flat institutional fluorescents are underexposed... and no warmth."
                ],
                "visual_inferences": [
                  "The room lacks any warm natural light, contributing to a cold and slightly oppressive back-room atmosphere."
                ],
                "creative_decisions": [
                  "Keeping the overall environment underexposed to emphasize the characters' anxiety and focus the viewer's attention on the glow of the monitor."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "shot_index": 2,
                "ref_usage": "exact_background",
                "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"
              }
            ],
            "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": "a5ce90da34382eff"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "잔혹한 살인 사건 현장 사진 확인",
        "representative_moment": "경찰서 책상 위에 놓인 잔혹한 살인사건 현장 사진을 위에서 내려다보는 클로즈업",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "CU high angle from slightly above desk height, cold fluorescent light with deep red contrast",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up high angle from above. Focus on P09, a glossy forensic photograph lying flat and facing the camera, centered in the frame. Within the printed image of the photo, a deeply damaged neck-and-shoulder area of a Korean adult figure is visible, showing disturbing deep red tissue details. P09 rests on a scratched beige laminate desk surface. Surrounding the photograph at the frame edges are scattered, disorganized case files, loose paper clips, and a pen, all out of focus to create a textured, chaotic boundary. Cold daylight and weak fluorescent spill flatten the paper surface, bathing the immediate surroundings in a stark, muted gray-beige palette, while the deep crimson tones of the printed wound stand out sharply against the chilly ambient fill. [L13: soft-focus paperwork and desk laminate framing the immediate edges]",
            "outfit_assignments": [],
            "source_facts": [
              "훼손된 목과 어깨 부위의 붉은 살점이 선명하게 찍힌 살인사건 현장 사진 클로즈업.",
              "Cold police-office daylight and weak fluorescent spill flatten the paper surface, while the red wound tones cut through the muted gray-beige palette.",
              "At slightly above desk height, looking down at the forensic photograph among blurred case papers."
            ],
            "visual_inferences": [
              "fixed_element police_office_environment: muted gray-beige palette illuminated by cold, desaturated fluorescent overhead lights",
              "fixed_element cluttered_desk_surface: scattered, disorganized paperwork slightly out of focus providing a chaotic boundary"
            ],
            "creative_decisions": [
              "Composed the photograph centered in the frame with its edges anchored by out-of-focus desk clutter to convey close framing without needing room background details.",
              "Used stark color contrast between the bleak gray-beige desk environment light and the vivid crimson details in the photo to emphasize the shocking horror of the discovery."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "7aa45090b4779483",
              "owned_hash": "37a8e1b41294114d",
              "camera_direction_hash": "3999ca5aa8c8c961",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "none",
        "_shot_index": 5,
        "visible_entities": [
          "P09",
          "P07",
          "L13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At slightly above desk height, the camera completes its push into a CU high angle over 혜수's desk, looking down at the forensic photograph among blurred case papers. The damaged neck-and-shoulder area within the printed image is centered and sharp, while the physical photo stays within a natural desk scale and the surrounding clutter softens at the frame edges.",
            "lighting_mood": "Cold police-office daylight and weak fluorescent spill flatten the paper surface, while the red wound tones cut through the muted gray-beige palette.",
            "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": [
              "P09",
              "P07",
              "L13"
            ],
            "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": "skipped_close_framing",
            "bg_id": "bg_office_day_empty_case_photos_on_desk",
            "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_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the police office features a stark, muted gray-beige color palette. It is illuminated by cold, desaturated fluorescent overhead lights that cast a weak, sterile glow across the room, creating a dim and chilling atmosphere.",
                "applies_to_shots": [
                  5,
                  6,
                  10
                ],
                "source_facts": [
                  "Cold police-office daylight and weak fluorescent spill flatten the paper surface",
                  "muted gray-beige palette",
                  "Desaturated fluorescent light drains her skin tone",
                  "dim police-office ambience"
                ],
                "visual_inferences": [
                  "The institutional walls and ambient shadows reinforce the emptiness and grim tone of the workspace."
                ],
                "creative_decisions": [
                  "Unified the background lighting and desaturated color grading across all close-up shots to maintain a consistent feeling of dread and isolation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cluttered_desk_surface",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "The flat surface of an office desk is densely covered with scattered, disorganized paperwork and case files. These cluttered documents remain slightly out of focus, providing a chaotic, textured boundary along the edge of the frame.",
                "applies_to_shots": [
                  5,
                  6
                ],
                "source_facts": [
                  "high angle over the desk, looking down at the forensic photograph among blurred case papers",
                  "locked CU at seated face height just beyond the desk edge"
                ],
                "visual_inferences": [
                  "The paperwork consists of typical generic office folders and investigation sheets, enhancing the realistic mess of an active precinct."
                ],
                "creative_decisions": [
                  "Defined the desk clutter as a continuous blurred element across the desk-level shots to anchor spatial continuity without distracting from the main subject."
                ],
                "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": [],
            "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": "a13374c0f2aab828"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "살인사건 사진 확인",
        "representative_moment": "수리영이 책상 위 사진들을 보고 눈을 크게 뜬 채 얼어붙어 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "locked close framing at seated face height, shallow DOF, desaturated lighting with faint red lower-eye reflection",
            "t2i_prompt": "Photorealistic cinematic still. An observer view at seated face height just beyond the desk edge. C01O02 in a casual jacket, a Korean young woman with long black hair, soft facial shape, and dark eyes, is framed from the chest up, occupying the center-left of the composition. She is seen at a three-quarter angle from the left, her posture frozen. Her dark eyes are wide open, looking downward at the implied space below the lower frame. Desaturated fluorescent light washes over her skin, draining its warmth, while a faint red reflection from below pools in her lower eye line. In the lower foreground, a chaotic, out-of-focus boundary of scattered paperwork forms a textured frame edge. [L13: Behind her, shallow depth of field blurs the muted gray-beige institutional police office, turning empty desks and cold overhead fluorescent fixtures into dim, chilling shapes].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "사진 위로 시선을 고정한 채 두 눈을 크게 뜨고 얼어붙은 수리영의 얼굴 클로즈업.",
              "Desaturated fluorescent light drains her skin tone",
              "The upward tilt resolves into a locked CU at seated face height just beyond the desk edge"
            ],
            "visual_inferences": [
              "fixed_element: police_office_environment (stark, muted gray-beige color palette, cold desaturated fluorescent overhead lights)",
              "fixed_element: cluttered_desk_surface (densely covered with scattered paperwork, out of focus)",
              "The photographs are kept out of frame to emphasize her psychological reaction to them."
            ],
            "creative_decisions": [
              "Used a head-and-shoulder composition instead of a full face-filling frame to prevent disembodied head generation, keeping the upper chest in frame.",
              "Applied shallow depth of field to render the background office and foreground desk as soft, out-of-focus boundaries."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "3d47115de80a833b",
              "owned_hash": "37a8e1b41294114d",
              "camera_direction_hash": "8cce80d536af8b49",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "S21_Shot5 provides the exact background environment and desk elements, maintained here but rendered out of focus due to close framing.",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "P09",
          "P07",
          "L13"
        ],
        "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": "The upward tilt resolves into a locked CU at seated face height just beyond the desk edge, using shallow DOF so the photographs remain only implied below frame. 수리영's face sits center-left in an eye-level composition, her widened eyes frozen downward while the empty police office blurs behind her.",
            "lighting_mood": "Desaturated fluorescent light drains her skin tone, with a faint red reflection from the photographs catching in the lower eye line.",
            "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",
              "P07",
              "L13"
            ],
            "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_office_day_empty_case_photos_on_desk",
            "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_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the police office features a stark, muted gray-beige color palette. It is illuminated by cold, desaturated fluorescent overhead lights that cast a weak, sterile glow across the room, creating a dim and chilling atmosphere.",
                "applies_to_shots": [
                  5,
                  6,
                  10
                ],
                "source_facts": [
                  "Cold police-office daylight and weak fluorescent spill flatten the paper surface",
                  "muted gray-beige palette",
                  "Desaturated fluorescent light drains her skin tone",
                  "dim police-office ambience"
                ],
                "visual_inferences": [
                  "The institutional walls and ambient shadows reinforce the emptiness and grim tone of the workspace."
                ],
                "creative_decisions": [
                  "Unified the background lighting and desaturated color grading across all close-up shots to maintain a consistent feeling of dread and isolation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "cluttered_desk_surface",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "The flat surface of an office desk is densely covered with scattered, disorganized paperwork and case files. These cluttered documents remain slightly out of focus, providing a chaotic, textured boundary along the edge of the frame.",
                "applies_to_shots": [
                  5,
                  6
                ],
                "source_facts": [
                  "high angle over the desk, looking down at the forensic photograph among blurred case papers",
                  "locked CU at seated face height just beyond the desk edge"
                ],
                "visual_inferences": [
                  "The paperwork consists of typical generic office folders and investigation sheets, enhancing the realistic mess of an active precinct."
                ],
                "creative_decisions": [
                  "Defined the desk clutter as a continuous blurred element across the desk-level shots to anchor spatial continuity without distracting from the main subject."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 5,
                "ref_usage": "exact_background",
                "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": "4530054be49d91b3"
      },
      {
        "scene_index": 21,
        "heading": "S#21. 경찰서 안 / D",
        "beat_title": "바다를 가리키는 GPS 좌표",
        "representative_moment": "A close-up of the empty workstation monitor displaying the dark sea map with a red GPS marker and coordinates.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close-up flat-on view of the monitor, cold blue-black screen glow contrasting with deep red marker, dim desaturated office ambient",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the dark blue-black sea map featuring a crisp, deep red location marker and digital coordinates, glowing on a computer monitor viewed nearly flat-on at eye level. The screen occupies the center of the frame, bordered by a black bezel. Below it, a slightly dusty keyboard rests on [L13: a stark, muted gray-beige desk surface lit by weak, cold desaturated fluorescent spill]. Messy P09 case folders lie stacked diagonally near the keyboard. In the immediate shadowy foreground, the dark backrest of an empty office chair angles away from the camera, emphasizing the chilling emptiness of the workstation.",
            "outfit_assignments": [],
            "source_facts": [
              "S#21 action: '모니터에서 뭔가 뜬다... 엄마 폰 위치추적 결과다. 해상 지도위에 좌표...'",
              "shot description: 어두운 해상 지도 위에 붉은색 위치 마커와 좌표 숫자가 선명하게 떠 있는 모니터 화면."
            ],
            "visual_inferences": [
              "fixed_element police_office_environment: cold desaturated fluorescent overhead lights, stark muted gray-beige palette",
              "Desk clutter, keyboard, and empty office chair provide foreground scale and reinforce the absence of the detective."
            ],
            "creative_decisions": [
              "Framed to emphasize the ominous red marker on the screen against the bleak, sterile office setting.",
              "Employed close framing to skip the background reference entirely, anchoring the shot to the immediate desk surfaces (L13)."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "9406d87688c4b1dc",
              "owned_hash": "6c3108d54d0cd477",
              "camera_direction_hash": "bba202f2a5fe74df",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "Maintains the cold, desaturated lighting and palette of the police office established in prior S21 shots.",
        "_shot_index": 10,
        "visible_entities": [
          "P09",
          "P07",
          "L13"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Beside 김형사's empty workstation, the lateral track ends in a nearly flat-on CU eye-level view of the computer monitor, framed so the dark sea map window, red location marker, coordinates, timestamp, and offline status are crisp and readable. The monitor screen occupies just under the central two-fifths of the frame, with the black bezel, keyboard, and desk clutter providing scale around it.",
            "lighting_mood": "The monitor casts a cold blue-black glow, punctured by the ominous deep red GPS marker against the dim police-office ambience.",
            "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": [
              "P09",
              "P07",
              "L13"
            ],
            "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": "skipped_close_framing",
            "bg_id": "bg_office_day_empty_location_result_on_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": "police_office_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the police office features a stark, muted gray-beige color palette. It is illuminated by cold, desaturated fluorescent overhead lights that cast a weak, sterile glow across the room, creating a dim and chilling atmosphere.",
                "applies_to_shots": [
                  5,
                  6,
                  10
                ],
                "source_facts": [
                  "Cold police-office daylight and weak fluorescent spill flatten the paper surface",
                  "muted gray-beige palette",
                  "Desaturated fluorescent light drains her skin tone",
                  "dim police-office ambience"
                ],
                "visual_inferences": [
                  "The institutional walls and ambient shadows reinforce the emptiness and grim tone of the workspace."
                ],
                "creative_decisions": [
                  "Unified the background lighting and desaturated color grading across all close-up shots to maintain a consistent feeling of dread and isolation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 5,
                "ref_usage": "exact_background",
                "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": [],
            "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": "873a94e354ca68f2"
      },
      {
        "scene_index": 22,
        "heading": "S#22. 경찰서 밖 / D",
        "beat_title": "경찰서를 뒤로하고 달려나가는 수리영",
        "representative_moment": "수리영이 결연한 표정으로 자전거 핸들을 꽉 쥐고 경찰서를 뒤로한 채 빠르게 달려나가는 순간",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight MCU with a slight low angle tracking backward, steel gray overcast daylight",
            "t2i_prompt": "Photorealistic cinematic still. Directly in front of the moving bicycle, the camera tracks backward in a tight MCU with a slight low angle. C01O02 in a dark track jacket, an East Asian young woman with long black hair, soft facial structure, and dark eyes, is facing the camera, her shoulders and upper body leaning forward over the handlebars in mid-action. Her eyes are fixed on the road ahead with a determined expression, her hair flowing back in the direction opposite to her forward motion. Her hands tightly grip the slightly worn rubber of the bicycle handlebars that cut across the lower foreground, with a slice of the bicycle's front frame visible below. The focus is on her tense forward posture and gripping hands. [L15: The background consists of out-of-focus receding gray exterior walls and open glass doors, blurred by motion]. Overcast daylight is underexposed into steel gray, reflecting a hard urban dampness with no warmth in the palette.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#22 action: '주차된 자전거를 타고 이내 달리는 수리영'",
              "Shot description: tight MCU, tracking backward directly in front of the moving bicycle, determined face dominates the center",
              "DP instruction: clenched grips cut across the lower foreground, police station entrance recedes behind"
            ],
            "visual_inferences": [
              "Hair flowing backward and motion blur on the background convey the high speed of the forward movement",
              "The slice of the bicycle frame anchors the subject physically so she does not appear floating",
              "The upper body remains in the frame to establish the tight MCU without triggering an isolated face composition"
            ],
            "creative_decisions": [
              "Used 'hair flowing back in the direction opposite to her forward motion' to satisfy the mid-action freeze constraint while preserving motion vector",
              "Omitted explicit reference-matching phrases per the skipped_close_framing background binding policy, rendering the receding background directly through L15",
              "Applied underexposed steel gray lighting to enhance the tense, damp urban atmosphere requested by the DP"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "663c602328fefe44",
              "owned_hash": "1893da4a0af6fede",
              "camera_direction_hash": "d8f60875c9ab8c3d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "Not dependent on a prior visual setup",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 22,
            "shot_index": 2
          },
          "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 moving bicycle, the camera tracks backward in a tight MCU with a slight low angle, positioned just beyond the handlebars. The clenched grips cut across the lower foreground, while 수리영's determined face dominates the center as the police station entrance recedes behind her.",
            "lighting_mood": "Overcast daylight is underexposed into steel gray, with hard urban dampness and no warmth in the palette.",
            "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",
              "L15"
            ],
            "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_exterior_entrance_day_bicycle_departure",
            "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": "086b5dd2e4634217"
      },
      {
        "scene_index": 23,
        "heading": "S#23. 어느 PC방 / 실내",
        "beat_title": "해상 위치 좌표 확인",
        "representative_moment": "C01이 PC방 모니터의 지도 화면을 뚫어지게 응시하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Seated eye level close-up profile shot, high contrast cold cyan-white monitor glow against pure black background.",
            "t2i_prompt": "Photorealistic cinematic still. [L16: The glowing edge of a dark plastic monitor bezel occupies the right side of the frame, displaying a bright cyan-white coordinate map]. C01O02 in a casual jacket, a young Korean woman with long black hair and a soft face shape, is seated in right profile, hunched forward toward the screen. The monitor's cold cyan glow reflects brightly on her cheek, nose, and the front of her jacket, while tiny red UI points catch in her dark eyes fixed on the display. The light sharply outlines her front profile, leaving the back of her head, shoulders, and the space behind her entirely swallowed in deep shadow. Focus on her intense side profile and the contrasting bright screen edge.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "Scene text states Suri-young is sitting at a monitor checking coordinates",
              "Shot description dictates a close-up profile of her staring intently at the bright map image"
            ],
            "visual_inferences": [
              "Only the side of her face, shoulder, and the monitor edge are visible in the close framing",
              "The dark PC room environment is reduced to pure black void behind her due to the bright screen exposure"
            ],
            "creative_decisions": [
              "Placed the monitor edge physically in the right frame to anchor the light source",
              "Used high contrast cyan-white reflection against deep black to emphasize concentration",
              "Integrated the red UI points reflecting in her dark eyes for visual accent"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "f1668e7b3941e2ad",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "306967b340f68109",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "P06",
          "P05",
          "L16"
        ],
        "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 close beside 수리영 at seated eye level, the camera holds a CU profile shot about two feet from her face, with the monitor edge and glowing map image sharing the right side of frame. The PC room around her falls into darkness, while her side profile and the bright coordinate map form the only readable plane.",
            "lighting_mood": "The monitor's cold cyan-white map glow carves her profile out of a nearly black PC room, with muted shadows and no decorative color except tiny red UI points.",
            "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",
              "P06",
              "P05",
              "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": "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": "6a8a6c7ceb056cdc"
      },
      {
        "scene_index": 24,
        "heading": "S#24. 해안가 / 소나기",
        "beat_title": "악천후 속 결연한 질주",
        "representative_moment": "C01이 빗물이 맺힌 얼굴로 거센 비바람을 뚫고 자전거를 밟으며 앞을 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Head-and-shoulder composition at eye level from the front-left, tight framing on the face, unsteady cinematic feel, heavy desaturated storm color.",
            "t2i_prompt": "Photorealistic cinematic still. Head-and-shoulder composition at eye level from the front-left. C01O02 in a wet dark activity jacket, a young Korean woman, leaning forward into the driving rain, at a three-quarter angle from the right, her eyes fixed on the road ahead. The same figure's face occupies the center frame, upper body and shoulder visible. Her visually distinguishing traits are carried over: long black hair flowing back in the direction opposite to her forward motion, a soft facial contour, and dark eyes. Raindrops streak across the camera lens and bead heavily on her cheeks. A wet bicycle handlebar edge and a slice of the front frame occupy the lower-left foreground. The soft background is a storm-dark coastal road slashed by intermittent lightning, heavy, cold, and desaturated. Cool silver-gray ambient light washes over her wet skin against the heavy storm.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S24 action: '자전거를 타고 빗속을 달리는 수리영. 오로지 엄마를 찾아야한다는 생각 뿐.'",
              "shot description: '굵은 빗방울이 사정없이 뺨에 맺힌 수리영의 굳센 표정 클로즈업.'",
              "DP note: 'Raindrops streak across the lens and bead on her cheeks... wet handlebar edge flickers through the lower-left foreground.'"
            ],
            "visual_inferences": [
              "zoom_in_detail from previous shot, maintaining the same environment and storm condition",
              "mid-pedal motion inferred from her leaning posture and hair flowing backward",
              "silver-gray ambient light on wet skin reflecting the intermittent lightning"
            ],
            "creative_decisions": [
              "Head-and-shoulder composition keeps the upper body in frame to prevent floating head effect, while staying true to the tight CU intent",
              "Handlebar and front frame slice anchored in the lower-left to ground the character's forward movement on the bicycle",
              "Soft background rendering with L06 to ensure the close framing isolates the primary subject"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "68c3343ed270de20",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "4888f9b2f09b1360",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 9,
        "dependency_reason": "zoom_in_detail (S9_Shot2) - 동일 인물, 공간의 줌인 디테일 캡처, 악천후 속 수리영의 얼굴 클로즈업",
        "_shot_index": 2,
        "visible_entities": [
          "C01",
          "L06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Matched to the bicycle's speed, the camera pushes in from 수리영's front-left side for a tight CU at eye level, slightly unsteady with the storm. Raindrops streak across the lens and bead on her cheeks, while her face stays center frame and the wet handlebar edge flickers through the lower-left foreground.",
            "lighting_mood": "Storm-dark daylight is slashed by intermittent lightning, turning her wet skin silver-gray while the scene remains heavy, cold, and desaturated.",
            "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",
              "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": 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": [
              {
                "scene_index": 9,
                "shot_index": 2,
                "ref_usage": "zoom_in_detail",
                "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": "0401364a3aa68014"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "난장판이 된 집안을 마주하고 충격에 굳은 수리영",
        "representative_moment": "수리영(C01)이 발자국과 뒤집힌 의자들로 엉망이 된 거실 한가운데서 숨을 죽인 채 굳어있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest height medium shot with a slight low angle, damp blue-gray dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. Captured from chest height with a slight low angle, focusing on the character's rigid posture. C01O02 in a dark activity jacket, a young East Asian woman with long black hair, soft facial shape, and dark eyes, stands rigid in mid-breath, occupying the center of the frame from waist to head. She is facing the camera, her wide eyes fixed on the off-frame bedroom doorway. The ruined living room stretches behind her. Low-key, damp blue-gray dusk light fills the space, falling on her shoulder and reflecting softly on her cheek. Weak natural light leaks through the open window from the reference at the rear angle, leaving the deeper corners draped in murky, heavy shadows. The overturned dining chairs from the reference lie on the floor, their legs jutting diagonally toward the camera side. Dark, wet muddy footprints trail across the floor surface from the window toward the interior.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#25 action: '누군가 다녀간 흔적으로 보이는 발자국들... 가재도구를 온통 헤집은 것으로 보인다. 거실에 난 창은 열려있고, 식탁 의자들을 쓰러져있다.'",
              "DP instruction: 'From chest height in the ruined living room, the camera creeps forward into an MS with a slight low angle, facing 수리영 directly... rigid and wide-eyed'"
            ],
            "visual_inferences": [
              "fixed_element dusk_blue_gray_lighting: low-key damp blue-gray dusk light creating deep interior shadows",
              "fixed_element ransacked_living_room: wooden dining chairs overturned, dark muddy footprints on the floor"
            ],
            "creative_decisions": [
              "Anchored the window and chairs using 'from the reference' to comply with background_ref_attached mode without generating new objects",
              "Framed the character from waist to head to match the chest-height camera position and avoid vertical clipping issues",
              "Incorporated stable_traits directly into the character description to ensure facial morphology and eye details are visually represented"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "a8946e7378f8b1ff",
              "owned_hash": "18fa02b2ac47d2f4",
              "camera_direction_hash": "4ab1ebdba1b1488d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "window",
                  "violating_phrase": "open window from the reference",
                  "reason": "The window is mentioned as an existing reference element with no explicit instruction to create, add, or modify it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "bedroom doorway",
                  "reason": "The doorway is used only as a directional/positional reference for the character's gaze, not as an instruction to redraw a door.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "같은 옥탑방 거실 공간의 배경 연속성 및 사물 배치 유지 (exact_background)",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "P01",
          "P04",
          "P05",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From chest height in the ruined living room, the camera creeps forward into an MS with a slight low angle, facing 수리영 directly while keeping the wrecked room legible behind her. She occupies the center of frame from waist to head, rigid and wide-eyed, with overturned chairs, open window, and muddy traces spread around the edges like evidence closing in.",
            "lighting_mood": "Dusk light leaks through the open window in a damp blue-gray wash, while deep interior shadows make the ruined room feel violated and airless.",
            "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",
              "P01",
              "P04",
              "P05",
              "L05"
            ],
            "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": "cb_living_dusk_ransacked_window_open",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "TV console",
              "air conditioner",
              "cooktop",
              "curtain",
              "debris",
              "document",
              "door",
              "floor cushion",
              "kitchen counter",
              "mug",
              "refrigerator",
              "shoe rack",
              "sink",
              "sofa",
              "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": "ransacked_living_room",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The living room is completely ransacked and chaotic. Wooden dining chairs are overturned and scattered on the floor, while dark, muddy footprints trail across the ground. A main window remains wide open, exposing the interior to the outside.",
                "applies_to_shots": [
                  3,
                  8
                ],
                "source_facts": [
                  "S#25 action: '누군가 다녀간 흔적으로 보이는 발자국들. 집안에서 뭔가를 찾기 위해 가재도구를 온통 헤집은 것으로 보인다. 거실에 난 창은 열려있고, 식탁 의자들을 쓰러져있다.'",
                  "Shot 3: 'overturned chairs, open window, and muddy traces spread around'",
                  "Shot 8: 'ransacked rooftop room recedes behind her'"
                ],
                "visual_inferences": [
                  "The dining chairs are wooden, typical for a modest rooftop apartment.",
                  "The muddy footprints are distinctly dark and visible against the floor surface."
                ],
                "creative_decisions": [
                  "Arranging the overturned chairs and mud trails irregularly to emphasize a violent, hasty intrusion rather than a simple mess."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dusk_blue_gray_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A low-key, damp blue-gray dusk light fills the interior space. Weak natural light leaks slowly through the open window and doorways, leaving the deeper corners of the rooms draped in murky, heavy shadows.",
                "applies_to_shots": [
                  3,
                  4,
                  8
                ],
                "source_facts": [
                  "Scene heading: '해질 무렵'",
                  "Shot 3: 'Dusk light leaks through the open window in a damp blue-gray wash'",
                  "Shot 4: 'Fading dusk and weak spill from the living room leave the bedroom murky'",
                  "Shot 8: 'Low-key dusk light... muting the room in gray-blue dampness'"
                ],
                "visual_inferences": [
                  "The color temperature is noticeably cool, dominated by blue and gray tones to reflect the fading daylight."
                ],
                "creative_decisions": [
                  "Using deep interior shadows combined with the blue-gray wash to create an airless, eerie atmosphere that unifies the sequence visually."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "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": "cb_living_dusk_ransacked_window_open",
                "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": "cd9492c8e0b1fbb1"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "붉은 원과 피 묻은 사진의 발견",
        "representative_moment": "어두운 방문 너머로 벽면에 피처럼 붉게 그려진 원형 표식과 그 정중앙에 꽂힌 낡은 사진이 보이는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "frontal medium shot at shoulder height from the doorway, blue-gray dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. Shot at shoulder height looking straight through the dark open door from the reference, creating a foreground border on both sides. A low-key, damp blue-gray dusk light fills the interior space, leaving the deep corners draped in heavy shadows. Centered directly on the pale far wall from the reference is a large, dry-blood-like red circular wall mark from the reference. Pinned at the precise middle of the red circle is a small, stained photograph from the reference. The unmade bed from the reference rests beneath the marked wall. The room is left murky by the fading dusk, with the red circular mark standing out as the only saturated color in the frame, focus fixed heavily on the pinned photograph.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 4 description: 수리영 방 벽면에 피가 마른 듯한 붉은 페인트 질감으로 크게 그려진 원형 표식과 그 중앙에 꽂힌 사진.",
              "DP instructions: At shoulder height from the bedroom doorway... frontal WS at eye-level, holding still so the red circular mark reads graphically on the far wall."
            ],
            "visual_inferences": [
              "fixed_element dusk_blue_gray_lighting: A low-key, damp blue-gray dusk light fills the interior space.",
              "The scene frames the environment without a character in the foreground to isolate the eerie discovery."
            ],
            "creative_decisions": [
              "Used the door from the reference as a dark vignette frame to anchor the viewer's eye onto the wall mark.",
              "Contrasted the dried deep-red circle against the damp blue-gray shadows to emphasize its supernatural and unsettling nature."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "72ca0a143787238e",
              "owned_hash": "b0bfa88101c56b24",
              "camera_direction_hash": "f9e53bd73baf9a3a",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "dark open door from the reference",
                  "reason": "The door is explicitly referenced as already present from the reference, so this is an anchor reference rather than a redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "far wall from the reference",
                  "reason": "The wall is only used as the referenced surface for composition and placement, not as a newly created object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall mark",
                  "violating_phrase": "red circular wall mark from the reference",
                  "reason": "The wall mark is explicitly described as coming from the reference, which anchors it instead of instructing a new draw.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "photograph",
                  "violating_phrase": "stained photograph from the reference",
                  "reason": "The photograph is explicitly marked as part of the reference scene, so it is anchored rather than newly generated.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bed",
                  "violating_phrase": "unmade bed from the reference",
                  "reason": "The bed is explicitly described as already existing in the reference, so this is an anchored mention.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "S12_Shot16의 옥탑방 배경을 참조하여 동일한 공간 레이아웃(문, 침대, 벽면 구조)의 연속성을 유지",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "P01",
          "P04",
          "P05",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At shoulder height from the bedroom doorway, the camera finishes the track into a frontal WS at eye-level, holding still so the red circular mark reads graphically on the far wall. The open doorframe creates a dark through-object border, the red circle sits centered on the wall, and the pinned photograph remains small but unmistakable at its middle.",
            "lighting_mood": "Fading dusk and weak spill from the living room leave the bedroom murky, with the dried deep-red circle becoming the only saturated color in the frame.",
            "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",
              "P01",
              "P04",
              "P05",
              "L05"
            ],
            "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": "cb_daughter_room_dusk_red_mark_photo_pinned",
            "reference_usage": "exact_background",
            "owned_objects": [
              "backpack",
              "bed",
              "curtain",
              "door",
              "floor",
              "footprint",
              "photograph",
              "pillow",
              "toy",
              "wall",
              "wall mark",
              "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_blue_gray_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A low-key, damp blue-gray dusk light fills the interior space. Weak natural light leaks slowly through the open window and doorways, leaving the deeper corners of the rooms draped in murky, heavy shadows.",
                "applies_to_shots": [
                  3,
                  4,
                  8
                ],
                "source_facts": [
                  "Scene heading: '해질 무렵'",
                  "Shot 3: 'Dusk light leaks through the open window in a damp blue-gray wash'",
                  "Shot 4: 'Fading dusk and weak spill from the living room leave the bedroom murky'",
                  "Shot 8: 'Low-key dusk light... muting the room in gray-blue dampness'"
                ],
                "visual_inferences": [
                  "The color temperature is noticeably cool, dominated by blue and gray tones to reflect the fading daylight."
                ],
                "creative_decisions": [
                  "Using deep interior shadows combined with the blue-gray wash to create an airless, eerie atmosphere that unifies the sequence visually."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "shot_index": 16,
                "ref_usage": "exact_background",
                "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": "cb_daughter_room_dusk_red_mark_photo_pinned",
                "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": "067fe7521d253da7"
      },
      {
        "scene_index": 25,
        "heading": "S#25. 옥탑방 안 / 해질 무렵",
        "beat_title": "혼란스러운 방을 뒤로하고 떠나는 수리영",
        "representative_moment": "C01 steps through the open doorway in right profile, carrying her backpack and holding the blood-stained photo, leaving the ransacked rooftop room behind.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium close-up (MCU), eye-level through-object framing, shallow depth of field, low-key dusk lighting with blue-gray dampness.",
            "t2i_prompt": "Photorealistic cinematic still. Medium close-up, eye-level composition. [L05: A dark doorframe forms a vertical line along the right third, framing a shallow-focus interior with overturned wooden chairs and muddy floor traces]. C01O02 in a casual jacket, a young Korean woman featuring long black hair, soft facial contours, and dark eyes, occupies the left-center foreground in right profile. She is posed half-stepping through the open doorway, eyes fixed on the outside corridor. Her upper chest and head occupy the frame, with P05 backpack straps visible over her shoulder. The edge of a creased, P04 blood-stained photo is held in her lowered hand at the bottom edge. Low-key dusk light leaks from the doorway, washing the surfaces in gray-blue dampness against deep shadows, highlighting the faint red stain on the photo. Focus on her determined side profile at the threshold.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              }
            ],
            "source_facts": [
              "S#25 action: '마치 이끌리듯 백팩을 메고 밖으로 나간다. 사진을 손에 꼭 쥔 채.'",
              "Shot 8: '백팩을 멘 채 현관문 밖으로 몸을 반쯤 내민 수리영의 결연한 옆얼굴.'"
            ],
            "visual_inferences": [
              "fixed_element ransacked_living_room: overturned wooden chairs and muddy footprints visible in shallow background.",
              "fixed_element dusk_blue_gray_lighting: low-key dusk light and gray-blue dampness.",
              "C01's dark eyes and long black hair are distinctly visible in profile."
            ],
            "creative_decisions": [
              "Using a right-third doorframe to create a vertical physical boundary between the chaotic interior and her escape path.",
              "Placing the blood-stained photo at the lower frame edge to serve as a symbolic accent in the dark MCU framing.",
              "Applying a shallow depth of field to keep the focus sharply on her side profile while the ransacked background remains blurred."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "af4b1b8b56ade553",
              "owned_hash": "18fa02b2ac47d2f4",
              "camera_direction_hash": "676df160be93d17c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 25,
        "dependency_reason": "exact_background of the same ransacked living room from S#25 Shot 3, utilizing the established dusk lighting and chaotic state.",
        "_shot_index": 8,
        "visible_entities": [
          "C01",
          "P01",
          "P04",
          "P05",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "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 just outside the threshold, the camera holds a medium close-up (MCU), eye-level, through-object framing with the doorframe cutting a dark vertical line along the right third. 수리영 occupies the left-center foreground, half-stepping out with her backpack visible, her determined side profile caught against the open doorway while the ransacked rooftop room recedes behind her in shallow focus.",
            "lighting_mood": "Low-key dusk light leaks from the doorway and open window, muting the room in gray-blue dampness with a faint deep-red stain from the photo as the only symbolic 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": [
              "C01",
              "P01",
              "P04",
              "P05",
              "L05"
            ],
            "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": "cb_living_dusk_ransacked_window_open",
            "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_living_room",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The living room is completely ransacked and chaotic. Wooden dining chairs are overturned and scattered on the floor, while dark, muddy footprints trail across the ground. A main window remains wide open, exposing the interior to the outside.",
                "applies_to_shots": [
                  3,
                  8
                ],
                "source_facts": [
                  "S#25 action: '누군가 다녀간 흔적으로 보이는 발자국들. 집안에서 뭔가를 찾기 위해 가재도구를 온통 헤집은 것으로 보인다. 거실에 난 창은 열려있고, 식탁 의자들을 쓰러져있다.'",
                  "Shot 3: 'overturned chairs, open window, and muddy traces spread around'",
                  "Shot 8: 'ransacked rooftop room recedes behind her'"
                ],
                "visual_inferences": [
                  "The dining chairs are wooden, typical for a modest rooftop apartment.",
                  "The muddy footprints are distinctly dark and visible against the floor surface."
                ],
                "creative_decisions": [
                  "Arranging the overturned chairs and mud trails irregularly to emphasize a violent, hasty intrusion rather than a simple mess."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dusk_blue_gray_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A low-key, damp blue-gray dusk light fills the interior space. Weak natural light leaks slowly through the open window and doorways, leaving the deeper corners of the rooms draped in murky, heavy shadows.",
                "applies_to_shots": [
                  3,
                  4,
                  8
                ],
                "source_facts": [
                  "Scene heading: '해질 무렵'",
                  "Shot 3: 'Dusk light leaks through the open window in a damp blue-gray wash'",
                  "Shot 4: 'Fading dusk and weak spill from the living room leave the bedroom murky'",
                  "Shot 8: 'Low-key dusk light... muting the room in gray-blue dampness'"
                ],
                "visual_inferences": [
                  "The color temperature is noticeably cool, dominated by blue and gray tones to reflect the fading daylight."
                ],
                "creative_decisions": [
                  "Using deep interior shadows combined with the blue-gray wash to create an airless, eerie atmosphere that unifies the sequence visually."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 25,
                "shot_index": 3,
                "ref_usage": "exact_background",
                "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": "37c9e67e052cad30"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "비 갠 후 안개 낀 빈 포구",
        "representative_moment": "짙은 안개로 인해 바다와 배가 거의 보이지 않는 비 젖은 텅 빈 포구의 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme wide establishing shot, high angle, cold desaturated blue-gray palette",
            "t2i_prompt": "Photorealistic cinematic still. A high-angle extreme wide shot. The bottom quarter of the frame is anchored by [L17: an empty, rain-wet darkened concrete pier], the water-soaked surface reflecting faint ambient dusk light. A heavy, pale mist swallows the entire middle and upper frame, severely limiting visibility. The seawater and scattered mooring posts along the edge are only suggested as pale, dissolving silhouettes fading into the dense atmospheric veil. The lighting palette is a cold, desaturated blue-gray, flattening the environment into a quiet, oppressive haze. Focus on the vast, desolate wet pavement disappearing into the impenetrable fog.",
            "outfit_assignments": [],
            "source_facts": [
              "소나기가 한차례 퍼 붓는가 싶더니, 비는 그치고 안개가 자욱하다. 텅 빈 포구.",
              "안개로 인해 배는 보이지 않고.",
              "The wet pier line sits low across the bottom quarter, while fog swallows nearly the entire middle and upper frame"
            ],
            "visual_inferences": [
              "fixed_element wet_foggy_harbor_environment: A heavy, pale mist obscures the background, severely limiting visibility",
              "fixed_element wet_foggy_harbor_environment: pervasive cool blue-gray hue",
              "The ground is soaked with water, reflecting faint ambient light from the recent heavy rain."
            ],
            "creative_decisions": [
              "Empty wide framing emphasizes isolation and the overwhelming scale of the fog.",
              "Desaturated blue-gray color grading to convey the chilling post-rain atmosphere."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "feca2de3bcfb7ac5",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "2b0a7c9fe9d6a78d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "none",
        "_shot_index": 1,
        "visible_entities": [
          "P03",
          "L17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static extreme wide / establishing shot (EWS), high angle, long take implied from the empty harbor entrance, about 25 meters from the pier. The wet pier line sits low across the bottom quarter, while fog swallows nearly the entire middle and upper frame so the seawater and boats are only suggested as pale, dissolving shapes.",
            "lighting_mood": "The palette is cold blue-gray and desaturated after rain, with the last dusk glow flattened by mist into a quiet, oppressive 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": [
              "P03",
              "L17"
            ],
            "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": "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_foggy_harbor_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A heavy, pale mist obscures the background, severely limiting visibility and softening the dusk light into a pervasive cool blue-gray hue. The ground, including the paved pier and natural rocks, is soaked with water, reflecting faint ambient light from the recent heavy rain.",
                "applies_to_shots": [
                  1,
                  3,
                  6
                ],
                "source_facts": [
                  "소나기가 한차례 퍼 붓는가 싶더니, 비는 그치고 안개가 자욱하다.",
                  "The wet pier line sits low across the bottom quarter, while fog swallows nearly the entire middle and upper frame",
                  "wet harbor rock and pale fog blur around the phone edges",
                  "Muted blue-gray fog light"
                ],
                "visual_inferences": [
                  "Puddles and lingering moisture on the harbor surfaces subtly reflect the muted dusk lighting, highlighting the dampness."
                ],
                "creative_decisions": [
                  "Unified desaturated blue-gray color grading across all shots to emphasize isolation, anxiety, and the chilling post-rain 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": [],
            "forbidden_refs": [],
            "readiness_policy": "not_applicable",
            "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": "180ca847f3fc5c83"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "부재중 전화를 확인하는 수리영",
        "representative_moment": "안개 낀 포구의 갯바위 위에서 수리영이 부재중 전화 알림이 떠 있는 스마트폰을 손에 쥐고 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close-up, high angle insert with shallow depth of field, cool bluish fog-light",
            "t2i_prompt": "Photorealistic cinematic still. Close-up, high angle insert from above. Focus on the hands of a young East Asian woman in a dark waterproof jacket, cradling P03. P03 occupies the central lower third, angled directly toward the camera, its screen illuminated with active notification graphics. Cool, fog-diffused dusk light washes the fingers, while the screen casts a weak bluish glow pooling on her skin. [L17: Dark, rain-slicked harbor rock forms the immediate surface beneath the hands, while pale, blue-gray wet mist severely blurs the frame edges through shallow depth of field.]",
            "outfit_assignments": [],
            "source_facts": [
              "진동벨이 울린다. 얼핏 보니 혜수이모다. 벌써 여러통 째 부재중 전화.",
              "A close-up (CU), high angle insert from less than 30 centimeters above 수리영’s hands",
              "phone casts a weak bluish glow"
            ],
            "visual_inferences": [
              "fixed_element wet_foggy_harbor_environment: heavy, pale mist and rain-soaked natural rocks",
              "hands trembling slightly while cradling the phone over the rocks"
            ],
            "creative_decisions": [
              "Used shallow depth of field to sharply isolate the smartphone screen and hands, heavily blurring the harbor rock and mist at the edges to maintain the close framing without background reference",
              "Applied a cool blue-gray dusk lighting with a weak bluish screen glow pooling on the hands to evoke anxiety and isolation"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "28051f313315c2ab",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "caf0d96c34f1f448",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "같은 포구 공간에서의 연속적인 시간 (배경 분위기 및 조명 유지)",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "P03",
          "L17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "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 close-up (CU), high angle insert from less than 30 centimeters above 수리영’s hands, using shallow DOF so the smartphone screen sits sharply in the central lower third without unnaturally enlarging it. 혜수’s name and repeated missed-call alerts face the camera clearly, while the wet harbor rock and pale fog blur around the phone edges.",
            "lighting_mood": "Cool fog-diffused dusk light wraps the hands, while the phone casts a weak bluish glow that feels anxious rather than comforting.",
            "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",
              "P03",
              "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": [
              {
                "element_id": "wet_foggy_harbor_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A heavy, pale mist obscures the background, severely limiting visibility and softening the dusk light into a pervasive cool blue-gray hue. The ground, including the paved pier and natural rocks, is soaked with water, reflecting faint ambient light from the recent heavy rain.",
                "applies_to_shots": [
                  1,
                  3,
                  6
                ],
                "source_facts": [
                  "소나기가 한차례 퍼 붓는가 싶더니, 비는 그치고 안개가 자욱하다.",
                  "The wet pier line sits low across the bottom quarter, while fog swallows nearly the entire middle and upper frame",
                  "wet harbor rock and pale fog blur around the phone edges",
                  "Muted blue-gray fog light"
                ],
                "visual_inferences": [
                  "Puddles and lingering moisture on the harbor surfaces subtly reflect the muted dusk lighting, highlighting the dampness."
                ],
                "creative_decisions": [
                  "Unified desaturated blue-gray color grading across all shots to emphasize isolation, anxiety, and the chilling post-rain atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "shot_index": 1,
                "ref_usage": "exact_background",
                "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": "c2aea17c7a93309e"
      },
      {
        "scene_index": 26,
        "heading": "S#26. 포구 / 해질 무렵",
        "beat_title": "간절한 부탁",
        "representative_moment": "C01이 닷줄을 고정하는 C03의 등 뒤로 다가서서 애원하듯 그를 올려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium close-up, low angle over-the-shoulder from dock level, compressed telephoto, muted blue-gray fog light with faint sodium accents",
            "t2i_prompt": "Photorealistic cinematic still. Medium close-up, low angle from the damp dock level looking upward. In the left foreground, the wet back and shoulder of C03O04 in a dark waterproof jacket, an Asian young man crouching over a taut mooring line, block the frame, his face partially visible in profile looking down at the wet dock surface. Sharing the narrow physical space just behind him at center-right, C01O02 in a hooded jacket, an Asian young woman, leans forward urgently, her upper body in frame at a three-quarter left angle. Focus on the tense space between them and her pleading expression, her dark eyes fixed on C03O04. Muted blue-gray fog light washes the characters, keeping their features underexposed, while faint sodium reflections pool on the wet rope and her jawline. [L17: thick, pale gray mist swallows the depth immediately behind them, with a slice of a damp boat hull visible on the right, isolating the characters].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "배에서 내린 인우는 닷줄을 고정시키고 있다.",
              "배로 다가가는 수리영.",
              "엄마를 찾아야하거든요."
            ],
            "visual_inferences": [
              "C03 is crouched low at dock level to secure the mooring line",
              "C01 leans closely from behind due to her urgency and the narrow pier space",
              "wet_foggy_harbor_environment continuity expressed through damp surfaces and thick pale mist"
            ],
            "creative_decisions": [
              "Low angle from dock level looking up to emphasize C01's earnest pleading over C03's blocking shoulder",
              "Muted blue-gray fog grading with faint sodium reflection to add a chilling yet focused atmosphere",
              "Close framing applied, isolating the immediate interaction space using thick mist instead of background references"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "f603c7f2973ffe98",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "efbacba8ed823788",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "S26_Shot1의 안개 자욱한 포구 분위기(atmosphere_reference)를 현재 샷의 조명과 안개 묘사(L17)로 유지",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "C03",
          "P03",
          "L17"
        ],
        "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": "At dock level behind 인우’s shoulder, the camera holds a medium close-up (MCU), low angle, over-the-shoulder composition with a compressed telephoto feel. 인우’s damp back and shoulder block the left foreground, while 수리영’s upper body appears tight behind him at center-right, leaning into the narrow gap with an urgent upward gaze.",
            "lighting_mood": "Muted blue-gray fog light keeps both faces underexposed, with faint sodium reflections on the wet rope and hull adding sickly warmth.",
            "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",
              "P03",
              "L17"
            ],
            "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": "wet_foggy_harbor_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A heavy, pale mist obscures the background, severely limiting visibility and softening the dusk light into a pervasive cool blue-gray hue. The ground, including the paved pier and natural rocks, is soaked with water, reflecting faint ambient light from the recent heavy rain.",
                "applies_to_shots": [
                  1,
                  3,
                  6
                ],
                "source_facts": [
                  "소나기가 한차례 퍼 붓는가 싶더니, 비는 그치고 안개가 자욱하다.",
                  "The wet pier line sits low across the bottom quarter, while fog swallows nearly the entire middle and upper frame",
                  "wet harbor rock and pale fog blur around the phone edges",
                  "Muted blue-gray fog light"
                ],
                "visual_inferences": [
                  "Puddles and lingering moisture on the harbor surfaces subtly reflect the muted dusk lighting, highlighting the dampness."
                ],
                "creative_decisions": [
                  "Unified desaturated blue-gray color grading across all shots to emphasize isolation, anxiety, and the chilling post-rain atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "shot_index": 1,
                "ref_usage": "atmosphere_reference",
                "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": "fab6a453dde0af87"
      },
      {
        "scene_index": 27,
        "heading": "S#27. 옥탑방 안 / 해질 무렵",
        "beat_title": "수리영의 음성메시지를 확인하는 혜수",
        "representative_moment": "텅 빈 옥탑방 한가운데 서서 스마트폰의 푸른빛을 받으며 굳은 얼굴로 화면을 응시하는 혜수.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium close-up, head-and-shoulder composition, rack focus emphasizing the rigid face, off-center placement with contrasting low-key dusk and blue-white screen glow.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level medium close-up, head-and-shoulder composition, framed slightly off-center. C02O03 in a dark coat, a Korean middle-aged woman with black hair, mature facial contours, and distinct eyes, standing in three-quarter left profile. Her tense face occupies the center-right, neck and upper chest visible in the frame. Her gaze is pinned downward, eyes fixed on P03, a smartphone clutched chest-high in her hands in the lower frame, the screen angled slightly upward. A cool blue-white light from the screen washes her lower face and jawline, mixing with a slanted low-key dusk light reflecting on her shoulder. Focus on her rigid expression caught in the phone's glow. [L05: soft out-of-focus frame-edge showing damp gray shadows and a blurred hint of scattered debris].",
            "outfit_assignments": [
              {
                "character_id": "C02",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S#27 scene text: '수리영의 녹음메시지를 확인하는 혜수'",
              "Shot 1 description: 'staring at her smartphone', 'rigid face', 'MCU', 'phone clutched chest-high'"
            ],
            "visual_inferences": [
              "fixed_element ruined_rooftop_room: scattered items and debris translated into a soft out-of-focus background edge due to close framing",
              "blue-white screen glow illuminating her face in the low-key dusk ambient"
            ],
            "creative_decisions": [
              "head-and-shoulder composition to maintain body connection in close framing, avoiding floating head syndrome",
              "contrasting cool blue screen light against dim slanted dusk light to emphasize psychological tension"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "9b13f00ebcf1956f",
              "owned_hash": "18fa02b2ac47d2f4",
              "camera_direction_hash": "96613c9432a20095",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 25,
        "dependency_reason": "exact_background (same room, different moment) - though close framing intentionally skips the direct background reference attachment, the spatial identity of the rooftop room is maintained.",
        "_shot_index": 1,
        "visible_entities": [
          "C02",
          "P03",
          "L05"
        ],
        "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": "Inside the rooftop room, the camera locks into a medium close-up (MCU), eye-level, with a restrained rack focus from the smartphone in 혜수’s hands up to her rigid face. She is framed slightly off-center in the middle of the wrecked living area, her gaze pinned downward at the phone just below lens line rather than confronting the camera.",
            "lighting_mood": "Low-key dusk seeps through the open window, mixing with the phone’s blue-white light on 혜수’s tense face and leaving the ruined room in damp gray shadow.",
            "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",
              "P03",
              "L05"
            ],
            "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": "cb_living_dusk_ransacked_window_open",
            "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": "ruined_rooftop_room",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a small rooftop room in a state of complete disarray. The living area is messy, with scattered items and debris indicating a recently wrecked space. A slanted, low-key dusk light filters in, casting cold and damp gray shadows across the room, while a slightly loose entrance door stands in the background.",
                "applies_to_shots": [
                  1,
                  2
                ],
                "source_facts": [
                  "S#27 scene text: '덜커덩 덜커덩. 바람에 현관문 소리. 황량하다.'",
                  "Shot 1 description: 'wrecked living area', 'ruined room in damp gray shadow'",
                  "Shot 2 description: 'messy room depth stretches behind him toward the rattling entrance', 'slanted, low-key dusk wash'"
                ],
                "visual_inferences": [
                  "scattered objects and debris across the floor to visually depict the 'wrecked' and 'messy' state without specific items mentioned"
                ],
                "creative_decisions": [
                  "use of strong gray shadows and slanted dusk light to emphasize the desolate, cold mood of the empty room"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 25,
                "shot_index": 3,
                "ref_usage": "exact_background",
                "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"
              }
            ],
            "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": "54807a9306de932c"
      },
      {
        "scene_index": 27,
        "heading": "S#27. 옥탑방 안 / 해질 무렵",
        "beat_title": "김형사의 비관적 추측과 옥탑방의 황량함",
        "representative_moment": "C05가 입술을 비튼 채 삐딱하게 서서 수리영이 돌아오지 않을 것이라며 어이없어하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height medium shot with a Dutch angle, cool slanted dusk lighting",
            "t2i_prompt": "Photorealistic cinematic still. Dutch angle composition from a chest-height perspective. C05O07 in a dark casual jacket, a Korean adult man with short black hair, ordinary facial structure, and deep-set eyes, stands at three-quarter angle from the right. He occupies the right half of the frame from mid-thigh upward, his weight resting unevenly with one hip dropped. His mouth is twisted dismissively, eyes fixed on an unseen figure to the left. A slanted, low-key dusk wash falls across the room, casting cold and damp gray shadows over his jacket and the surrounding surfaces. The background reveals the depth of the ruined rooftop room in complete disarray. The debris from the reference is scattered across the floor. In the rear distance, the door from the reference stands slightly open, while the window from the reference allows dim outside light to filter into the messy living area. Focus on the figure's crooked, dismissive stance anchored against the desolate, rattling depth of the room.",
            "outfit_assignments": [
              {
                "character_id": "C05",
                "outlook_id": "O07"
              }
            ],
            "source_facts": [
              "S#27 scene text: '그럴리가요. (혀를 끌끌 차며) 아이구 쯧쯧... 덜커덩 덜커덩. 바람에 현관문 소리. 황량하다.'",
              "Shot 2 description: '입술을 비튼 채 어이없다는 듯 짝다리를 짚고 선 김형사의 삐딱한 전신.'"
            ],
            "visual_inferences": [
              "fixed_element ruined_rooftop_room applied with explicit background anchors for 'debris', 'door', and 'window' from the reference",
              "Dutch angle and chest-height perspective inferred from DP's lateral track framing instructions",
              "slanted dusk wash emphasizing the cold, desolate mood"
            ],
            "creative_decisions": [
              "adapted DP's wide-shot full-body instruction to a medium shot (mid-thigh upward) to comply with the primary framing scale rules of the card",
              "used explicit anchor phrasings like 'the door from the reference' to bind owned objects without duplicating them in the attached background"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "86eb2d9435ac8c8f",
              "owned_hash": "18fa02b2ac47d2f4",
              "camera_direction_hash": "185a323f84b50f64",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "debris",
                  "violating_phrase": "The debris from the reference is scattered across the floor",
                  "reason": "Although this mentions debris, it is explicitly anchored by 'from the reference' and describes existing background debris rather than instructing a new redraw.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "the door from the reference stands slightly open",
                  "reason": "The door is explicitly referenced as part of the existing reference background, so this is an anchor reference rather than a new creation request.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "the window from the reference allows dim outside light",
                  "reason": "The window is explicitly tied to 'from the reference,' which marks it as an existing background object being referenced, not redrawn.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "exact_background: 이전 샷과 동일한 옥탑방 배경(ruined_rooftop_room) 유지, 카메라 앵글과 인물의 행동만 이 순간에 맞춰 새로 묘사",
        "_shot_index": 2,
        "visible_entities": [
          "C05",
          "P03",
          "L05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The lateral track settles into a wide shot (WS), Dutch angle, at chest height along the side of the living area, holding 김형사’s full body about three meters away. He occupies the right half with one hip dropped and his mouth twisted, while the messy room depth stretches behind him toward the rattling entrance.",
            "lighting_mood": "A slanted, low-key dusk wash cuts across the room, making 김형사’s dismissive posture feel colder against the hollow wind from the door.",
            "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",
              "P03",
              "L05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C05",
                "outlook_id": "O07"
              }
            ],
            "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_living_dusk_ransacked_window_open",
            "reference_usage": "exact_background",
            "owned_objects": [
              "TV",
              "TV console",
              "air conditioner",
              "cooktop",
              "curtain",
              "debris",
              "document",
              "door",
              "floor cushion",
              "kitchen counter",
              "mug",
              "refrigerator",
              "shoe rack",
              "sink",
              "sofa",
              "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": "ruined_rooftop_room",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a small rooftop room in a state of complete disarray. The living area is messy, with scattered items and debris indicating a recently wrecked space. A slanted, low-key dusk light filters in, casting cold and damp gray shadows across the room, while a slightly loose entrance door stands in the background.",
                "applies_to_shots": [
                  1,
                  2
                ],
                "source_facts": [
                  "S#27 scene text: '덜커덩 덜커덩. 바람에 현관문 소리. 황량하다.'",
                  "Shot 1 description: 'wrecked living area', 'ruined room in damp gray shadow'",
                  "Shot 2 description: 'messy room depth stretches behind him toward the rattling entrance', 'slanted, low-key dusk wash'"
                ],
                "visual_inferences": [
                  "scattered objects and debris across the floor to visually depict the 'wrecked' and 'messy' state without specific items mentioned"
                ],
                "creative_decisions": [
                  "use of strong gray shadows and slanted dusk light to emphasize the desolate, cold mood of the empty room"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "shot_index": 1,
                "ref_usage": "exact_background",
                "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": "C05O07",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "cb_living_dusk_ransacked_window_open",
                "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": "50a10c615be70581"
      },
      {
        "scene_index": 28,
        "heading": "바다 + 갑판 / 해질 무렵",
        "beat_title": "바다 한가운데의 고립",
        "representative_moment": "해질 무렵 붉은 노을을 등지고 바다 한가운데 떠 있는 소형어선의 고독한 실루엣.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme wide establishing shot, low angle over the water, deep red sunset silhouette",
            "t2i_prompt": "Photorealistic cinematic still. Extreme wide establishing shot from low over the open water, the dark, lightly choppy sea [L18] occupying the lower frame and a deep red-orange sunset band under heavy clouds filling the upper frame. A small fishing boat [L19] sits in the center-left, dwarfed by the vast ocean and rendered as a lonely, ominous silhouette against the evening horizon. The damp hull is angled with its port bow toward the camera. Restrained deep-red sunset light reflects on the water's surface and catches the faint structural outline of the wheelhouse from the reference, while muted charcoal-blue shadows and a thin atmospheric haze stretch across the distance. Focus on the isolated silhouette of the boat adrift in the moody seascape.",
            "outfit_assignments": [],
            "source_facts": [
              "Scene heading: 바다 + 갑판 / 해질 무렵",
              "Shot 1: muted charcoal-blue with a restrained deep-red sunset band",
              "Shot description: 해질 무렵 붉은 노을빛이 비치는 바다 한가운데 떠 있는 소형어선의 조용한 전경."
            ],
            "visual_inferences": [
              "fixed_element evening_sea_and_sunset: dark rolling open sea, deep-red evening sky, cool damp charcoal-blue shadows",
              "Boat appears as a dark silhouette dwarfed by the vast ocean",
              "Low camera angle places water in the lower frame and sky in the upper frame"
            ],
            "creative_decisions": [
              "Placing the boat in the center-left to emphasize the vast emptiness of the surrounding ocean",
              "Using silhouette and contrasting red/blue lighting to build an ominous, isolated atmosphere before the tension inside the boat begins"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "afb392ef5cf5df7a",
              "owned_hash": "dc0f99e9f7f00426",
              "camera_direction_hash": "7d9d9762d599c09f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "wheelhouse",
                  "violating_phrase": "the faint structural outline of the wheelhouse from the reference",
                  "reason": "The phrase explicitly references the existing wheelhouse from the reference, so it is treated as an anchored background object rather than a newly drawn one.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 1,
        "visible_entities": [
          "P06",
          "P04",
          "L18",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "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 low over the open water off the boat’s port bow, the camera begins a slow dolly-in in an extreme wide / establishing shot (EWS), low angle, silhouette framing against the red evening horizon. The small fishing boat sits in the center-left and occupies only a modest portion of the frame, dwarfed by the dark, rolling sea and the blood-colored strip of sunset.",
            "lighting_mood": "The sea is rendered in muted charcoal-blue with a restrained deep-red sunset band, turning the boat into a lonely, ominous 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": [
              "P06",
              "P04",
              "L18",
              "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": "bg_deck_dusk_at_sea",
            "reference_usage": "exact_background",
            "owned_objects": [
              "GPS display",
              "anchor",
              "antenna",
              "bait tub",
              "bulwark",
              "cleat",
              "deck",
              "deck mark",
              "engine hatch",
              "fish box",
              "fish crate",
              "fuel locker",
              "helm console",
              "mast",
              "navigation light",
              "net roller",
              "radio",
              "rail",
              "rope",
              "sliding door",
              "stern gate",
              "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": "evening_sea_and_sunset",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, rolling open sea under a deep-red evening sky. The setting sun casts a distinct blood-red light mixed with cool, damp charcoal-blue shadows across the wet deck of the small fishing boat, creating a lonely and ominous atmosphere.",
                "applies_to_shots": [
                  1,
                  4,
                  5
                ],
                "source_facts": [
                  "Scene heading: 바다 + 갑판 / 해질 무렵 (Sea + deck / Evening)",
                  "Shot 1: muted charcoal-blue with a restrained deep-red sunset band",
                  "Shot 4: Deep red sunset light grazes... wet deck falls into cool, damp shadow",
                  "Shot 5: red sunset rim light and cold sea shadow"
                ],
                "visual_inferences": [
                  "The sea appears deep and restless, amplifying the isolation of the small boat, while the wet deck reflects the contrasting red and blue tones."
                ],
                "creative_decisions": [
                  "Using the stark contrast between the warm, bloody red of the sunset and the cold, dark shadows of the sea to build a sense of impending tension across all framings."
                ],
                "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": "background",
                "id": "bg_deck_dusk_at_sea",
                "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": "2e4779970a1ffe83"
      },
      {
        "scene_index": 28,
        "heading": "바다 + 갑판 / 해질 무렵",
        "beat_title": "피 묻은 옛 사진을 건네는 순간 (손 클로즈업)",
        "representative_moment": "수리영의 손에 들린 낡고 피 묻은 옛날 사진이 화면 중앙에 선명하게 잡힌다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "near-macro extreme close-up (ECU), high angle, shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. High angle near-macro extreme close-up. Close on a young Korean woman's tense hand holding P04, a small, worn and aged paper photograph featuring noticeable dark red bloodstains smeared across its surface. The edges of the photograph look slightly frayed from time and handling, with its front surface facing the camera in sharp focus in the central third. Deep red sunset light grazes the photograph’s blood marks and the damp fingertips anchoring the lower edge, while [L19: the wet, dark deck of the small fishing boat] blurs closely beneath it into cool, damp charcoal-blue shadows. P06, a partly blurred unfolded paper map, lies flat and angled away in the soft out-of-focus background beneath the hand.",
            "outfit_assignments": [],
            "source_facts": [
              "S#28 action: 25씬의 사진을 보여준다",
              "Shot 4: 수리영의 손안에 들린 낡고 피 묻은 옛날 사진 클로즈업.",
              "Deep red sunset light grazes the photo’s blood marks while the rest of the deck falls into cool, damp shadow."
            ],
            "visual_inferences": [
              "fixed_element persistent_prop: A small, worn and aged paper photograph featuring noticeable dark red bloodstains smeared across its surface.",
              "fixed_element environment_state: cool, damp charcoal-blue shadows across the wet deck",
              "high angle view isolating the hand and the deck directly below, excluding the character's body"
            ],
            "creative_decisions": [
              "Applied 'Close on' phrasing with demographic descriptor (young Korean woman) instead of C01O02 to strictly follow the body_part_focus_rule and prevent floating face generation.",
              "Removed absolute distance metrics (20-30 centimeters) and expressed relative spatial arrangement (beneath it).",
              "Described the background dynamically using local frame-edge surfaces ([L19: wet, dark deck]) to adhere to skipped_close_framing rules without referencing the full room."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "c44ab0c7763f7361",
              "owned_hash": "dc0f99e9f7f00426",
              "camera_direction_hash": "f55f178c9332fc45",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 28,
        "dependency_reason": "동일 씬 내 앞선 샷의 환경(바다와 석양의 붉고 푸른 조명 대비)과 소품(피 묻은 사진)의 외형적 연속성 유지",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "P06",
          "P04",
          "L18",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A near-macro extreme close-up (ECU), high angle, shallow DOF insert hovers 20–30 centimeters above 수리영’s hand at chest height. The old blood-stained photograph sits sharply in the central third with the tiny ‘금월’ clue legible, while her fingers anchor the lower edge and the wet deck blurs into reddish dusk behind it.",
            "lighting_mood": "Deep red sunset light grazes the photo’s blood marks while the rest of the deck falls into cool, damp shadow.",
            "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",
              "P06",
              "P04",
              "L18",
              "L19"
            ],
            "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_deck_dusk_at_sea",
            "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": "evening_sea_and_sunset",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, rolling open sea under a deep-red evening sky. The setting sun casts a distinct blood-red light mixed with cool, damp charcoal-blue shadows across the wet deck of the small fishing boat, creating a lonely and ominous atmosphere.",
                "applies_to_shots": [
                  1,
                  4,
                  5
                ],
                "source_facts": [
                  "Scene heading: 바다 + 갑판 / 해질 무렵 (Sea + deck / Evening)",
                  "Shot 1: muted charcoal-blue with a restrained deep-red sunset band",
                  "Shot 4: Deep red sunset light grazes... wet deck falls into cool, damp shadow",
                  "Shot 5: red sunset rim light and cold sea shadow"
                ],
                "visual_inferences": [
                  "The sea appears deep and restless, amplifying the isolation of the small boat, while the wet deck reflects the contrasting red and blue tones."
                ],
                "creative_decisions": [
                  "Using the stark contrast between the warm, bloody red of the sunset and the cold, dark shadows of the sea to build a sense of impending tension across all framings."
                ],
                "confidence": "high"
              },
              {
                "element_id": "blood_stained_old_photograph",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A small, worn and aged paper photograph featuring noticeable dark red bloodstains smeared across its surface. The edges of the photo look slightly frayed from time and handling.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "S#28 action: 25씬의 사진을 보여준다",
                  "Shot 4: old blood-stained photograph sits sharply in the central third",
                  "Shot 5: blurred edge of the photograph low in the foreground"
                ],
                "visual_inferences": [
                  "The photograph is physically weathered, with the bloodstains dried into a dark, rusty crimson over the faded image."
                ],
                "creative_decisions": [
                  "Positioning the photograph as a persistent visual anchor in both the macro insert and the close-up reaction shot, maintaining its physical presence near the lens."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 28,
                "shot_index": 1,
                "ref_usage": "exact_background",
                "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": "beb34e158efa97e8"
      },
      {
        "scene_index": 28,
        "heading": "바다 + 갑판 / 해질 무렵",
        "beat_title": "당황한 인우의 일그러진 표정",
        "representative_moment": "C03가 피 묻은 옛 사진을 보고 극도로 당황해 눈이 커진 채 얼어붙은 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At eye level, tight close-up composition with out-of-focus foreground anchor, deep red sunset rim light mixed with cold shadow",
            "t2i_prompt": "Photorealistic cinematic still. C03O04 in dark fisher workwear, a Korean young man with short black hair and a slender face, tight framing on his face and upper chest, positioned at three-quarter angle from the right. His jaw is clenched, recoiling back, wide dark eyes fixed downward. In the lower foreground, the blurred edge of a small worn paper photograph, with dark red bloodstains smeared across its surface, sits out-of-focus, the image side facing him. A sickly mix of deep blood-red sunset rim light catches his profile, while cold, damp charcoal-blue shadows leave his cheeks underlit. [L19: A softly blurred wet deck railing is positioned diagonally behind him, merging with a dim, wet wheelhouse door and the rolling dark sea under a deep-red evening sky in the out-of-focus background.]",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "S#28 action: (사진보더니 당황) 몰라. 모른다구.",
              "Shot 5: 사진에서 시선을 떼지 못한 채 크게 당황하여 눈이 커진 인우의 일그러진 표정.",
              "DP directive: At 인우’s eye level, less than a meter from his face, the camera pushes into a close-up... blurred edge of the photograph low in the foreground",
              "Entity traits: C03 is a Korean young man, short black hair, slender face, dark eyes."
            ],
            "visual_inferences": [
              "fixed_element blood_stained_old_photograph: small, worn paper with dark red bloodstains smeared across",
              "fixed_element evening_sea_and_sunset: deep-red evening sky with cool, damp charcoal-blue shadows",
              "The tight framing preserves the upper chest and shoulders to prevent a floating head composite, complying with close framing face phrasing rules."
            ],
            "creative_decisions": [
              "Placing the out-of-focus photograph in the lower foreground creates depth and physically anchors his trapped downward gaze without fully revealing the photo's contents.",
              "Using the sickly mix of deep red rim light and damp blue shadow directly on his profile to visually amplify the sense of panic and isolation."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "1b907957c33afefc",
              "owned_hash": "dc0f99e9f7f00426",
              "camera_direction_hash": "eb670b056cc2a9dc",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 28,
        "dependency_reason": "동일 씬 내 이전 샷(Shot 4)의 조명 상태(저녁 바다 노을과 푸른 그림자)와 고정 소품(피 묻은 사진)의 연속성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C03",
          "P06",
          "P04",
          "L18",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 인우’s eye level, less than a meter from his face, the camera pushes into a close-up (CU), eye-level, with the blurred edge of the photograph low in the foreground keeping his gaze trapped below the lens. His face fills most of the center frame, three-quarter to camera, eyes widened and expression warped by recognition before he bolts toward the wheelhouse.",
            "lighting_mood": "A sickly mix of red sunset rim light and cold sea shadow sharpens the panic in 인우’s eyes while leaving his cheeks underlit.",
            "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",
              "P06",
              "P04",
              "L18",
              "L19"
            ],
            "allowed_outlook_pairs": [
              {
                "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": "bg_deck_dusk_at_sea",
            "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": "evening_sea_and_sunset",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, rolling open sea under a deep-red evening sky. The setting sun casts a distinct blood-red light mixed with cool, damp charcoal-blue shadows across the wet deck of the small fishing boat, creating a lonely and ominous atmosphere.",
                "applies_to_shots": [
                  1,
                  4,
                  5
                ],
                "source_facts": [
                  "Scene heading: 바다 + 갑판 / 해질 무렵 (Sea + deck / Evening)",
                  "Shot 1: muted charcoal-blue with a restrained deep-red sunset band",
                  "Shot 4: Deep red sunset light grazes... wet deck falls into cool, damp shadow",
                  "Shot 5: red sunset rim light and cold sea shadow"
                ],
                "visual_inferences": [
                  "The sea appears deep and restless, amplifying the isolation of the small boat, while the wet deck reflects the contrasting red and blue tones."
                ],
                "creative_decisions": [
                  "Using the stark contrast between the warm, bloody red of the sunset and the cold, dark shadows of the sea to build a sense of impending tension across all framings."
                ],
                "confidence": "high"
              },
              {
                "element_id": "blood_stained_old_photograph",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A small, worn and aged paper photograph featuring noticeable dark red bloodstains smeared across its surface. The edges of the photo look slightly frayed from time and handling.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "source_facts": [
                  "S#28 action: 25씬의 사진을 보여준다",
                  "Shot 4: old blood-stained photograph sits sharply in the central third",
                  "Shot 5: blurred edge of the photograph low in the foreground"
                ],
                "visual_inferences": [
                  "The photograph is physically weathered, with the bloodstains dried into a dark, rusty crimson over the faded image."
                ],
                "creative_decisions": [
                  "Positioning the photograph as a persistent visual anchor in both the macro insert and the close-up reaction shot, maintaining its physical presence near the lens."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 28,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "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": "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": "c41121941bbd680b"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "사진 속 소녀를 가리키는 손가락",
        "representative_moment": "A young woman's fingertip presses firmly onto a blood-stained photograph showing a little girl.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up (ECU) high angle macro, tilted shallowly downward, low-key red dusk and weak green instrument light",
            "t2i_prompt": "Photorealistic cinematic still. Extreme close-up high angle macro from an observer, tilted shallowly downward. Focus on a young East Asian woman's fingertip, her wrist extending from a dark activity jacket sleeve, pressing firmly onto the center of a creased, blood-stained photograph (P04). The photograph's front surface is angled toward the camera, displaying the faded image of a young East Asian girl. Low-key red dusk light washes across the hand and the paper surface, mixing with a weak green instrument glow catching on the knuckles. The prop is held against [L20: a soft, out-of-focus frame-edge background showing a blurred slice of a damp steering console and a smeared deep red circular mark painted on the dark bulkhead].",
            "outfit_assignments": [],
            "source_facts": [
              "수리영의 손에 들린 낡은 사진 속 어린 여자애 형상을 꾹 누른 손가락 클로즈업.",
              "이 사진속의 얘가 우리 엄마예요.",
              "blurred red circular mark on the bulkhead",
              "weak green instrument light"
            ],
            "visual_inferences": [
              "fixed_element red_circular_wall_markings: smeared deep red circular mark on the bulkhead in the soft background",
              "fixed_element worn_steering_console: a slice of the steering console visible at the frame edge",
              "The fingertip isolates the exact face in the photograph to force the observer's attention on the young girl."
            ],
            "creative_decisions": [
              "Extreme close-up macro framing completely excluding the character's face, utilizing body-part focus phrasing to adhere strictly to close-framing and ID policies.",
              "Using a mix of red dusk light and weak green instrument glow to evoke a claustrophobic and occult atmosphere.",
              "Placing the steering console and a blurred red mark in the L20 background block to maintain the spatial anchor without violating the skipped background binding."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "cfb5d9f3ef9a5a7c",
              "owned_hash": "5dbcf0b558780b0b",
              "camera_direction_hash": "e0fc4fec5fc57378",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No prior scene dependency specified.",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "P04",
          "P01",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the cramped wheelhouse, the camera drops low over 수리영’s hands into an extreme close-up (ECU), high angle macro, tilted shallowly downward so the pressed fingertip and the young girl in the photograph command the center without the prop exceeding natural scale. The steering console and a blurred red circular mark on the bulkhead sit in the background, hinting that the evidence connects to the room around them.",
            "lighting_mood": "Low-key red dusk through the wheelhouse glass mixes with weak green instrument light, making the damp cabin feel claustrophobic and occult-charged.",
            "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",
              "P01",
              "L20"
            ],
            "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_wheelhouse_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": "red_circular_wall_markings",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Dense, ritualistic red circular markings are painted tightly across the dim walls of the boat's cabin. The crude circles spread edge-to-edge on the bulkheads, standing out as deep, ominous accents against the cold gray-green shadows of the grimy interior.",
                "applies_to_shots": [
                  4,
                  6,
                  11
                ],
                "source_facts": [
                  "조타실안 수많은 원. 빙글빙글 돌고 여기에서 또다시 발견된 붉은 원!",
                  "blurred red circular mark on the bulkhead",
                  "dense red circular paint markings spread edge to edge",
                  "muted red wall marks bleeding softly behind him"
                ],
                "visual_inferences": [
                  "The circles appear to be hastily painted or smeared, varying slightly in size but forming a dense, claustrophobic and occult pattern."
                ],
                "creative_decisions": [
                  "Using the red marks as a recurring background and midground motif across different focal lengths to steadily build tension."
                ],
                "confidence": "high"
              },
              {
                "element_id": "worn_steering_console",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A worn, mechanical steering console of a small boat, faintly glowing with weak green instrument light. It remains fixed within the cramped cabin, serving as an architectural anchor for the space.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "The steering console... sit in the background",
                  "weak green instrument light",
                  "blurred sliver of the helm console... at the left foreground"
                ],
                "visual_inferences": [
                  "The console is aged and weathered, matching the old, damp aesthetic of the small fishing vessel."
                ],
                "creative_decisions": [
                  "Keeping the console partially visible either in the background or as a foreground sliver to ground the spatial geometry of the extremely tight wheelhouse."
                ],
                "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"
              }
            ],
            "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": "ce04259bd74230d0"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "기괴한 붉은 원들의 발견",
        "representative_moment": "A cramped wheelhouse wall heavily covered in crude, ritualistic red circular markings.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "WS eye-level through-object composition with left foreground framing, cool gray-green shadows against deep red accents",
            "t2i_prompt": "Photorealistic cinematic still. Focus on the dense red circular paint markings from the reference spreading edge-to-edge across the dim wheelhouse bulkhead from the reference. The cramped wall fills the midground, entirely covered in crude, ritualistic red circles standing out against the grimy interior. In the extreme left foreground, a heavily blurred sliver of the worn helm console from the reference and the edge of the window from the reference serve as out-of-focus architectural anchors, keeping the claustrophobic geometry visible. Low-key dusk ambient light leaks through the dirty glass, pooling in cold gray-green shadows across the floor from the reference, while weak green instrument light glows faintly on the console surface, leaving the red paint as a deep, ominous accent.",
            "outfit_assignments": [],
            "source_facts": [
              "조타실안 수많은 원. 빙글빙글 돌고 여기에서 또다시 발견된 붉은 원!",
              "dense red circular paint markings spread edge to edge",
              "blurred sliver of the helm console and window frame sit at the left foreground"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: None (character excluded from this frame to focus entirely on the wall pattern)",
              "fixed_element worn_steering_console serves as a depth anchor in the cramped cabin",
              "The circles appear to be hastily painted or smeared, forming a claustrophobic occult pattern"
            ],
            "creative_decisions": [
              "Used the helm console and window as heavily blurred extreme foreground elements to maintain spatial depth and emphasize the claustrophobic feel of the boat.",
              "Applied low-key dusk lighting with cool gray-green ambient fill to make the red marks visually pop without revealing full room illumination."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "c9a665e88c7d2a57",
              "owned_hash": "5dbcf0b558780b0b",
              "camera_direction_hash": "a5b994c9d1df04ba",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bulkhead",
                  "violating_phrase": "the dim wheelhouse bulkhead from the reference",
                  "reason": "The owned object is mentioned with an explicit reference phrase and no redraw verb directly targets it, so it is treated as an anchored existing background element.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "helm console",
                  "violating_phrase": "the worn helm console from the reference",
                  "reason": "The phrase explicitly anchors the console to the reference/background and does not instruct creating or modifying it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "the edge of the window from the reference",
                  "reason": "The window is only referenced as an existing background anchor, not as something to add, draw, or change.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "shadows across the floor from the reference",
                  "reason": "The floor is only mentioned as part of a reference-anchored lighting description, with no redraw intent.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "exact_background from Shot 4 to ensure the wheelhouse spatial geometry and wall markings remain consistent",
        "_shot_index": 6,
        "visible_entities": [
          "P04",
          "P01",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "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 an observer perspective, the camera holds at the end of the pan at eye-level near Inwoo’s shoulder line, about five feet from the wheelhouse wall, in a WS eye-level through-object composition. The cramped wall fills the midground with dense red circular paint markings spread edge to edge, while a blurred sliver of the helm console and window frame sit at the left foreground, keeping the boat’s claustrophobic geometry visible without breaking focus.",
            "lighting_mood": "Low-key dusk light leaks through dirty glass, flattening the room into cold gray-green shadows while the red paint reads as a deep, ritualistic 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": [
              "P04",
              "P01",
              "L20"
            ],
            "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_wheelhouse_dusk_red_circle_marks",
            "reference_usage": "exact_background",
            "owned_objects": [
              "GPS screen",
              "VHF radio",
              "bench locker",
              "bulkhead",
              "chart",
              "chart table",
              "clipboard",
              "fishfinder screen",
              "floor",
              "helm console",
              "helm wheel",
              "mark",
              "sliding door",
              "swivel chair",
              "throttle",
              "window",
              "windscreen"
            ],
            "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": "red_circular_wall_markings",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Dense, ritualistic red circular markings are painted tightly across the dim walls of the boat's cabin. The crude circles spread edge-to-edge on the bulkheads, standing out as deep, ominous accents against the cold gray-green shadows of the grimy interior.",
                "applies_to_shots": [
                  4,
                  6,
                  11
                ],
                "source_facts": [
                  "조타실안 수많은 원. 빙글빙글 돌고 여기에서 또다시 발견된 붉은 원!",
                  "blurred red circular mark on the bulkhead",
                  "dense red circular paint markings spread edge to edge",
                  "muted red wall marks bleeding softly behind him"
                ],
                "visual_inferences": [
                  "The circles appear to be hastily painted or smeared, varying slightly in size but forming a dense, claustrophobic and occult pattern."
                ],
                "creative_decisions": [
                  "Using the red marks as a recurring background and midground motif across different focal lengths to steadily build tension."
                ],
                "confidence": "high"
              },
              {
                "element_id": "worn_steering_console",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A worn, mechanical steering console of a small boat, faintly glowing with weak green instrument light. It remains fixed within the cramped cabin, serving as an architectural anchor for the space.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "source_facts": [
                  "The steering console... sit in the background",
                  "weak green instrument light",
                  "blurred sliver of the helm console... at the left foreground"
                ],
                "visual_inferences": [
                  "The console is aged and weathered, matching the old, damp aesthetic of the small fishing vessel."
                ],
                "creative_decisions": [
                  "Keeping the console partially visible either in the background or as a foreground sliver to ground the spatial geometry of the extremely tight wheelhouse."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 4,
                "ref_usage": "exact_background",
                "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": "bg_wheelhouse_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": "7d44eb9b7d3f19ac"
      },
      {
        "scene_index": 29,
        "heading": "S#29. 조타실 / 해질 무렵",
        "beat_title": "의식을 잃은 수리영과 서늘한 인우",
        "representative_moment": "자신의 어깨에 쓰러진 C01을 무표정하게 내려다보는 C03의 서늘한 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight MCU low angle, shallow DOF, cold dusk spill",
            "t2i_prompt": "Photorealistic cinematic still. Tight MCU low angle composition with shallow depth of field, focused on C03O04's expression. C03O04 in fisher workwear, a Korean young man with short black hair and a slender face, occupies the upper right third of the frame at a three-quarter angle from the left, his chin lowered over the figure below, cold dark eyes fixed on her. In the lower left foreground, C01O02 in a dark activity jacket, a Korean young woman with long black hair and a soft facial shape, appears in right profile with eyes closed, slumping as a soft, out-of-focus heavy shape onto his shoulder, providing a shared physical anchor between them. Cold dusk spill and weak ambient highlights reflect on C03O04's cheek and eyes. [L20: frame-edge background compressed by out-of-focus dense, ritualistic red circular markings bleeding softly across the dim surface, alongside a shadowed vertical doorframe].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O02"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "의식이 혼미해지는 수리영. 수리영을 노려보는 인우의 어깨에 그대로 쓰러진다.",
              "Dense, ritualistic red circular markings are painted tightly across the dim walls of the boat's cabin."
            ],
            "visual_inferences": [
              "C03's expression is cold and almost inhuman, looking down at the vulnerable C01.",
              "C01's weight heavily presses onto C03's shoulder, creating a stark foreground/background contrast.",
              "The shallow depth of field smears the red circular marks into an ominous blur behind C03's head."
            ],
            "creative_decisions": [
              "Positioned C01 in the lower left foreground as a soft shape to emphasize C03's sharp, dominant expression in the upper right.",
              "Substituted 'carving' light instructions with 'reflect on' to avoid T2I physical slicing errors, while keeping the cold dusk spill mood.",
              "Applied skipped_close_framing policy by encapsulating background elements strictly within an L20 bracketed description at the frame edge."
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "13701819ff14d8a7",
              "owned_hash": "5dbcf0b558780b0b",
              "camera_direction_hash": "7ff155c4e3756114",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "exact_background from Scene 29 Shot 6 is referenced for the red marks, represented here as an out-of-focus texture due to the close framing policy.",
        "_shot_index": 11,
        "visible_entities": [
          "C01",
          "C03",
          "P04",
          "P01",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera tracks back into the collapse and settles just below Inwoo’s eye line, near Suriyoung’s fallen shoulder, in a tight MCU low angle with shallow DOF. Suriyoung occupies the lower left foreground as a soft, heavy shape against Inwoo’s shoulder, while Inwoo’s face and cold downward eyes sit in the upper right third, his expression almost still enough to feel inhuman.",
            "lighting_mood": "Cold dusk spill and weak instrument reflections carve Inwoo’s eyes from shadow, with muted red wall marks bleeding softly behind him.",
            "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",
              "P04",
              "P01",
              "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": "bg_wheelhouse_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": "red_circular_wall_markings",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Dense, ritualistic red circular markings are painted tightly across the dim walls of the boat's cabin. The crude circles spread edge-to-edge on the bulkheads, standing out as deep, ominous accents against the cold gray-green shadows of the grimy interior.",
                "applies_to_shots": [
                  4,
                  6,
                  11
                ],
                "source_facts": [
                  "조타실안 수많은 원. 빙글빙글 돌고 여기에서 또다시 발견된 붉은 원!",
                  "blurred red circular mark on the bulkhead",
                  "dense red circular paint markings spread edge to edge",
                  "muted red wall marks bleeding softly behind him"
                ],
                "visual_inferences": [
                  "The circles appear to be hastily painted or smeared, varying slightly in size but forming a dense, claustrophobic and occult pattern."
                ],
                "creative_decisions": [
                  "Using the red marks as a recurring background and midground motif across different focal lengths to steadily build tension."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 6,
                "ref_usage": "exact_background",
                "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": "9712e7d501d1d4df"
      },
      {
        "scene_index": 30,
        "heading": "S#30. 바다 / 해질 무렵",
        "beat_title": "미지의 공간으로 진입하는 배",
        "representative_moment": "짙은 안개 장벽 속으로 뱃머리가 반쯤 가려진 채 들어가는 소형어선의 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low trailing observer perspective just above the waterline, muted sunset gold lighting",
            "t2i_prompt": "Photorealistic cinematic still. From a low trailing observer perspective just above the waterline. A small fishing boat mid-transit, its stern centered in the upper middle of the frame, the bow half-swallowed by a thick, opaque wall of gray fog ahead. Focus on the stern of the boat and the long, foamy white wake stretching toward the lower foreground like a pale, torn seam. [L18: Dark, rippled sea surface surrounding the frame, lit by a muted sunset gold partially veiled by haze, casting an uneasy faint glow over the black water.]",
            "outfit_assignments": [],
            "source_facts": [
              "S#30 action: '서서히 안개 안으로 들어가는 인우의 배.'",
              "shot description: boat moving forward, stern facing camera, bow half-swallowed by the fog wall ahead, long white wake stretching from the boat"
            ],
            "visual_inferences": [
              "low water-level trailing camera angle to emphasize the barrier of fog",
              "strong contrast between the pale white wake and the black water"
            ],
            "creative_decisions": [
              "positioned the stern in the upper middle of the frame to visually represent the boat being consumed by the mist",
              "muted gold and dark gray palette to enhance the occult mystery tone and the boundary-crossing atmosphere"
            ],
            "confidence": "high",
            "owned_validation": {
              "schema_version": 1,
              "t2i_prompt_hash": "25b91650b1d07b2a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "1f35ae9e3340f350",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 3,
        "visible_entities": [
          "L18"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 30,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a low trailing observer perspective just above the waterline, the camera tracks several boat lengths behind the small fishing boat in a WS low angle. The stern stays centered in the upper middle of frame, the bow half-swallowed by the fog wall ahead, while the long white wake stretches from the boat toward the lower foreground like a torn seam in the dark sea.",
            "lighting_mood": "Muted sunset gold is smothered by gray fog and black water, leaving only the wake as a pale, uneasy guide into the mist.",
            "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": [
              "L18"
            ],
            "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": "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": [],
            "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": [],
            "forbidden_refs": [],
            "readiness_policy": "not_applicable",
            "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": "3cf59978048ff84e"
      }
    ]
  },
  "step_id": "scene_detail",
  "run_id": "db57783a-e0fa-423b-93e3-9b7528f31bd4",
  "resolved_model": "gemini-pro",
  "updated_at": "2026-05-08T04:56:31.685919+00:00",
  "project_config_snapshot": {}
}