{
  "status": "completed",
  "completed_count": 255,
  "applicable_count": 255,
  "failed_count": 0,
  "schema_version": 13,
  "config_hash": "c03e20f06e1ff761",
  "data": {
    "scenes": [
      {
        "scene_index": 1,
        "heading": "실외. 겨울 갈대숲 - 낮",
        "beat_title": "갈대숲을 달리는 조선인 생존자들",
        "representative_moment": "C20O22 figures flee through the reeds in mid-stride, caught in a high-contrast monochrome wide shot.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height lateral wide view in high-contrast black-and-white monochrome",
            "t2i_prompt": "Photorealistic cinematic still. A lateral wide view observed from waist height. C20O22, a group of Asian figures in ragged traditional hanbok, showing the variant features carried from stable_traits — traditional topknots and braided hair, starving faces evident throughout. The figures are spread across the middle band of the frame at a three-quarter angle from the right, caught in mid-stride. Each figure is positioned with a planted rear foot and an outstretched leading foot, preserving forward momentum toward the right edge of the frame. They wear terrified expressions, looking off-screen to the right. The runners are framed against [L01: a dense winter reed field rendered entirely in stark, high-contrast black-and-white monochrome daylight, where tall dry winter reeds create sharp silhouettes and deep shadows]. The established reeds intermittently cross the foreground, separating individual figures in the stark separation of light and shadow.",
            "outfit_assignments": [
              {
                "character_id": "C20",
                "outlook_id": "O22"
              }
            ],
            "source_facts": [
              "Shot description: Korean survivors fleeing through reeds mid-stride",
              "Camera at waist height, lateral wide view tracking parallel",
              "Black-and-white high-contrast daylight"
            ],
            "visual_inferences": [
              "Waist height wide framing captures both torsos and full leg extensions laterally",
              "fixed_element monochrome_winter_reed_field creates deep shadows and silhouettes"
            ],
            "creative_decisions": [
              "Placed figures in the middle band of the frame to emphasize lateral motion",
              "Used established foreground reeds to add depth without obscuring the figures' opposing leg positions"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bullet impact",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "reed",
                "usage_kind": "anchor",
                "source_phrase": "The established reeds intermittently cross the foreground"
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "cc39494a7d392d9e",
              "owned_hash": "b25661d1ef1098a8",
              "camera_direction_hash": "cf255fb50cc65bee",
              "owned_usage_hash": "83caf9f3c249a03b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "reed",
                  "violating_phrase": "The established reeds intermittently cross the foreground, separating individual figures in the stark separation of light and shadow.",
                  "reason": "The prompt references the established reeds to describe compositional depth and shadows, acting purely as an anchor for framing the figures rather than requesting a redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No prior scene dependency specified for this exact shot.",
        "_shot_index": 3,
        "visible_entities": [
          "C20",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At waist height, the camera tracks parallel to the fleeing group from a lateral position, holding a wide view that keeps terrified faces and opposing running-leg positions legible among the reeds. The survivors spread across the middle band of the frame, each caught between a planted rear foot and an outstretched leading foot, while the lateral motion preserves their forward momentum toward off-screen safety.",
            "lighting_mood": "High-contrast monochrome daylight renders the fleeing figures and reeds in stark black-and-white separation.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C20",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C20",
                "outlook_id": "O22"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L01B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bullet impact",
              "door",
              "footprint",
              "reed",
              "threshold",
              "warehouse"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "monochrome_winter_reed_field",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense winter reed field rendered entirely in stark, high-contrast black-and-white monochrome daylight. The tall, dry winter reeds create sharp silhouettes and deep shadows, establishing a completely colorless and bleak landscape.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 겨울 갈대숲 - 낮",
                  "콘트라스트 강한 흑백 화면",
                  "High-contrast monochrome daylight renders the fleeing figures and reeds in stark black-and-white separation."
                ],
                "visual_inferences": [
                  "The environment lacks any hue, fully committing to the harsh black-and-white cinematic aesthetic.",
                  "The dry reeds are tall enough to partially obscure figures passing through them."
                ],
                "creative_decisions": [
                  "Maximize the contrast between deep blacks and bright whites in the environment to heighten the brutal, dramatic atmosphere of the pursuit."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C20O22",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L01B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "8a848def12cbbfcd"
      },
      {
        "scene_index": 1,
        "heading": "실외. 겨울 갈대숲 - 낮",
        "beat_title": "갈대숲을 가로지르는 일본군의 무자비한 사격",
        "representative_moment": "C22O24 fires P03 through the reeds, a brief burst of muzzle flame illuminating the stark monochrome landscape.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Shoulder-height medium framing from behind, high-contrast black-and-white with bright muzzle flash",
            "t2i_prompt": "Photorealistic cinematic still. Medium framing from shoulder height behind and slightly beside the formation. C22O24 in a military uniform, an East Asian man, seen from over the shoulder, frozen mid-stride advancing through the environment. He holds P03 braced against his shoulder, the rifle barrel cutting diagonally through the lower foreground, pointing off-screen. Several unnamed East Asian soldiers in military uniforms are layered across the midground, preserving a forward pursuit formation with their own P03 rifles. A sharp burst of muzzle flame erupts from the nearest P03, puncturing the high-contrast black-and-white monochrome daylight. The dense winter reed stalks frame the narrow sightlines, casting sharp deep shadows across the completely colorless landscape.",
            "outfit_assignments": [
              {
                "character_id": "C22",
                "outlook_id": "O24"
              }
            ],
            "source_facts": [
              "실외. 겨울 갈대숲 - 낮",
              "일본군이 갈대숲 저 너머로 사냥하듯 총알을 갈기며 전진한다.",
              "shot description: Japanese soldiers firing rifles through a winter reed field, muzzle flames visible."
            ],
            "visual_inferences": [
              "fixed_element monochrome_winter_reed_field: A dense winter reed field rendered entirely in stark, high-contrast black-and-white monochrome daylight",
              "The reeds break up the soldiers' formation and provide narrow sightlines along the rifle axis"
            ],
            "creative_decisions": [
              "Medium framing from shoulder height places the observer directly behind the firing line to emphasize the pursuit axis",
              "Muzzle flash providing the sole burst of bright illumination against the bleak B&W environment to heighten tension"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bullet impact",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "footprint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "reed",
                "usage_kind": "anchor",
                "source_phrase": "The dense winter reed stalks frame the narrow sightlines"
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "2dab29110434b61b",
              "owned_hash": "b25661d1ef1098a8",
              "camera_direction_hash": "0bf7f6bab57c9d5f",
              "owned_usage_hash": "9f00ead45c4a112a",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "reed",
                  "violating_phrase": "The dense winter reed stalks frame the narrow sightlines",
                  "reason": "The prompt mentions the reed stalks solely as a framing element and a source of shadows, which aligns with the producer's declaration of an anchor reference rather than a redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 1,
        "dependency_reason": "previous_shot_refs indicates S1_Shot3 with exact_background, meaning the same room/environment (the winter reed field) is maintained.",
        "_shot_index": 5,
        "visible_entities": [
          "C22",
          "L01",
          "P03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From shoulder height behind and slightly beside the formation, the camera dollies inward along the aligned rifle barrels at the instant they fire. The nearest rifle line cuts diagonally through the lower foreground while advancing Japanese soldiers remain layered across the midground, preserving their forward formation and the pursuit axis.",
            "lighting_mood": "High-contrast monochrome daylight is punctured by the brief brightness of the rifle muzzle flames.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C22",
              "L01",
              "P03"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C22",
                "outlook_id": "O24"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L01B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bullet impact",
              "door",
              "footprint",
              "reed",
              "threshold",
              "warehouse"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "monochrome_winter_reed_field",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense winter reed field rendered entirely in stark, high-contrast black-and-white monochrome daylight. The tall, dry winter reeds create sharp silhouettes and deep shadows, establishing a completely colorless and bleak landscape.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 겨울 갈대숲 - 낮",
                  "콘트라스트 강한 흑백 화면",
                  "High-contrast monochrome daylight renders the fleeing figures and reeds in stark black-and-white separation."
                ],
                "visual_inferences": [
                  "The environment lacks any hue, fully committing to the harsh black-and-white cinematic aesthetic.",
                  "The dry reeds are tall enough to partially obscure figures passing through them."
                ],
                "creative_decisions": [
                  "Maximize the contrast between deep blacks and bright whites in the environment to heighten the brutal, dramatic atmosphere of the pursuit."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C22O24",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L01B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7d0ff1fb0cde5244"
      },
      {
        "scene_index": 1,
        "heading": "실외. 겨울 갈대숲 - 낮",
        "beat_title": "소금창고로의 다급한 도피",
        "representative_moment": "과거의 조선인 육혈귀 생존자들이 낡은 나무 소금창고 안으로 몸을 던져 허공에 떠 있는 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low waist-height wide shot, high-contrast monochrome daylight",
            "t2i_prompt": "Photorealistic cinematic still. Seen from a low waist-height observer position, multiple C20O22 in ragged traditional clothes, starving Korean figures, leap forward with their backs to the camera toward the open door of the salt warehouse entrance in the middle-center background. Their airborne backs and kicked-up legs occupy the middle and lower frame, caught mid-action in flight over the threshold, gazing off-screen into the dark interior. High-contrast monochrome daylight fully commits to a harsh black-and-white cinematic aesthetic, keeping the airborne bodies sharply separated from the entrance. Body volume is preserved against the high-contrast light, with faint rim light tracing their shoulders and traditional topknots. The tall, dry winter reed stalks flank the exterior field, creating sharp silhouettes that contrast with the dark wooden warehouse structure.",
            "outfit_assignments": [
              {
                "character_id": "C20",
                "outlook_id": "O22"
              }
            ],
            "source_facts": [
              "S1 action: 때마침 염전 소금창고 정도 크기의 나무집을 발견, 안으로 숨어든다.",
              "shot description: 과거의 조선인 육혈귀 생존자들이 낡은 나무 소금창고 문 안쪽을 향해 몸을 던져 허공에 떠 있는 뒷모습."
            ],
            "visual_inferences": [
              "fixed_element monochrome_winter_reed_field: High-contrast monochrome daylight renders the reeds and figures in stark black-and-white.",
              "Mid-air leaping pose emphasizes the desperate escape into the warehouse.",
              "Traditional topknots (상투와 쪽머리) carry over from entity stable_traits to visually distinguish the historical figures."
            ],
            "creative_decisions": [
              "Low waist-height camera position anchors the kicked-up legs in the lower frame, pointing motion toward the middle-center background warehouse entrance to satisfy the spatial contract.",
              "Faint rim lighting on the figures' backs preserves body volume and depth, preventing the back-to-camera silhouettes from appearing as flat cutouts."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "open door of the salt warehouse entrance"
              },
              {
                "owned_token": "reed",
                "usage_kind": "anchor",
                "source_phrase": "dry winter reed stalks flank the exterior field"
              },
              {
                "owned_token": "threshold",
                "usage_kind": "anchor",
                "source_phrase": "in flight over the threshold"
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "anchor",
                "source_phrase": "salt warehouse entrance"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "26cbf59a47753e51",
              "owned_hash": "1e0f453bfce81ab2",
              "camera_direction_hash": "6b627870afe2f1f1",
              "owned_usage_hash": "2823bcb54645721b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "open door of the salt warehouse entrance",
                  "reason": "The prompt references the open door as a spatial destination for the jumping figures, acting as an anchor in agreement with the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "reed",
                  "violating_phrase": "dry winter reed stalks flank the exterior field",
                  "reason": "The prompt describes the dry winter reed stalks to establish silhouettes and composition without redrawing them, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "threshold",
                  "violating_phrase": "in flight over the threshold",
                  "reason": "The threshold is used purely as a spatial reference point to describe the path of the jumping characters, which is a valid anchor use.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "warehouse",
                  "violating_phrase": "salt warehouse entrance",
                  "reason": "The prompt references the warehouse structure for lighting contrast and spatial location, functioning as an anchor as declared by the producer.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 7,
        "visible_entities": [
          "C20",
          "L01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 1,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At a slightly lowered waist-height position, the camera advances directly behind the survivors and centers the salt-warehouse entrance. Their airborne backs and kicked-up legs occupy the middle and lower frame at the endpoint, while the open doorway remains fully readable beyond them as the destination of the movement.",
            "lighting_mood": "High-contrast monochrome daylight keeps the airborne bodies sharply separated from the warehouse entrance.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "salt warehouse entrance",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C20",
              "L01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C20",
                "outlook_id": "O22"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L01B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "door",
              "reed",
              "threshold",
              "warehouse"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "monochrome_winter_reed_field",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense winter reed field rendered entirely in stark, high-contrast black-and-white monochrome daylight. The tall, dry winter reeds create sharp silhouettes and deep shadows, establishing a completely colorless and bleak landscape.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 겨울 갈대숲 - 낮",
                  "콘트라스트 강한 흑백 화면",
                  "High-contrast monochrome daylight renders the fleeing figures and reeds in stark black-and-white separation."
                ],
                "visual_inferences": [
                  "The environment lacks any hue, fully committing to the harsh black-and-white cinematic aesthetic.",
                  "The dry reeds are tall enough to partially obscure figures passing through them."
                ],
                "creative_decisions": [
                  "Maximize the contrast between deep blacks and bright whites in the environment to heighten the brutal, dramatic atmosphere of the pursuit."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 1,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C20O22",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L01B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "3f355aa1b7591267"
      },
      {
        "scene_index": 2,
        "heading": "실내. 창고 - 낮",
        "beat_title": "창고가 발각된 순간",
        "representative_moment": "C22가 창고 문턱을 넘으며 안쪽을 향해 비릿한 웃음을 짓는다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium framing from the central interior axis, isolating the foremost soldier in severe high-contrast daylight.",
            "t2i_prompt": "Photorealistic cinematic still. The opened warehouse doorway dominates the middle-center background. C22O24 in a khaki tunic, a Japanese adult man with short black hair and an angular face, occupies the middle frame at three-quarter angle from the left, leaning forward across the threshold. His eyes are fixed off-screen toward the dark interior, wearing a cold smile. Behind him, additional unnamed Japanese soldiers in early 20th-century khaki uniforms and peaked caps stand layered at the entrance. Severe high-contrast daylight pours in, brightly illuminating the soldiers while casting the interior into deep shadow. The door stands wide open on its hinge, as the warehouse wall frames the outer edges of the image.",
            "outfit_assignments": [
              {
                "character_id": "C22",
                "outlook_id": "O24"
              }
            ],
            "source_facts": [
              "벌컥 열리는 창고 문",
              "일본군 장교가 회심의 미소를 짓는다",
              "Daylight entering through the opened doorway produces a severe high-contrast separation"
            ],
            "visual_inferences": [
              "fixed_element open_wooden_doorway: The crude wooden door stands wide open",
              "fixed_element makeshift_warehouse_interior: roughly assembled wooden planks and mismatched boards framing the edges",
              "fixed_element japanese_soldiers_uniform: khaki tunics and peaked caps on the background soldiers"
            ],
            "creative_decisions": [
              "Placed the opened warehouse doorway squarely in the middle-center background to fulfill the spatial contract and anchor the depth.",
              "Used severe backlighting to visually separate the brightly lit invading soldiers from the dim warehouse interior."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "brace",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "The door stands wide open"
              },
              {
                "owned_token": "doorway",
                "usage_kind": "anchor",
                "source_phrase": "The opened warehouse doorway dominates the middle-center background"
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hinge",
                "usage_kind": "anchor",
                "source_phrase": "on its hinge"
              },
              {
                "owned_token": "post",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "anchor",
                "source_phrase": "leaning forward across the threshold"
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "the warehouse wall frames the outer edges of the image"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "3e3ef81886b3bddf",
              "owned_hash": "2e3d8a5862b7130f",
              "camera_direction_hash": "79a341ee062d3c5b",
              "owned_usage_hash": "daec48be459dfd33",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "doorway",
                  "violating_phrase": "The opened warehouse doorway dominates the middle-center background",
                  "reason": "The doorway is mentioned purely as a background reference to establish composition without any redraw or alteration instructions, consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "threshold",
                  "violating_phrase": "leaning forward across the threshold",
                  "reason": "The threshold is used as a spatial reference for the character's position and movement, which is an anchor reference consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "The door stands wide open",
                  "reason": "The door's open state is described for spatial composition without requiring redesign or new generation, matching the producer's anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "hinge",
                  "violating_phrase": "on its hinge",
                  "reason": "The hinge is mentioned as a spatial anchor for the door's open position, which is an anchor reference matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "the warehouse wall frames the outer edges of the image",
                  "reason": "The wall is mentioned as a compositional framing element, which acts as an anchor reference and matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C22",
          "L02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "On the central interior axis at eye level, the dolly-in ends close enough to make the soldiers' inward-looking smiles readable while retaining the full opened doorway around them. The foremost soldier occupies one side of the middle frame in three-quarter view, with additional soldiers layered behind him at the threshold and the warehouse interior framing the image edges.",
            "lighting_mood": "Daylight entering through the opened doorway produces a severe high-contrast separation between the soldiers and the warehouse interior.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "opened warehouse doorway",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C22",
              "L02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C22",
                "outlook_id": "O24"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L02B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "brace",
              "door",
              "doorway",
              "floor",
              "hinge",
              "post",
              "threshold",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "makeshift_warehouse_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior walls of a makeshift warehouse constructed from roughly assembled wooden planks and mismatched wooden boards. The structure features a crude, unfinished texture with visible gaps and splinters throughout the wooden surfaces.",
                "applies_to_shots": [
                  3,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "판자와 각목 등을 얼기설기 대충 덧대어 만든 가건물",
                  "warehouse interior framing the image edges",
                  "Daylight warehouse interior"
                ],
                "visual_inferences": [
                  "The uneven wooden boards have visible gaps and a coarse texture resulting from crude, improvised construction."
                ],
                "creative_decisions": [
                  "Emphasizing the mismatched wooden planks to highlight the desolate and fragile atmosphere of the shelter."
                ],
                "confidence": "high"
              },
              {
                "element_id": "open_wooden_doorway",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A crude wooden door of the warehouse stands wide open, clearly defining the threshold between the interior and exterior. The open doorway remains completely unobstructed, framing the entrance.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "벌컥 열린 창고 문턱",
                  "opened doorway",
                  "open doorway"
                ],
                "visual_inferences": [
                  "The open door is constructed from the same rough wooden materials as the surrounding warehouse walls."
                ],
                "creative_decisions": [
                  "Keeping the doorway wide open to establish a stark lighting contrast between the inside and outside before the door abruptly shuts in the following sequence."
                ],
                "confidence": "high"
              },
              {
                "element_id": "japanese_soldiers_uniform",
                "element_type": "character_state",
                "character_name": "Japanese soldiers",
                "description": "The men are dressed in standard early 20th-century Imperial Japanese military uniforms, consisting of khaki tunics, trousers, and peaked military caps. They wear standard field gear including leather utility belts.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "일본군 병사",
                  "soldiers"
                ],
                "visual_inferences": [
                  "Based on the early 20th-century colonial setting, the soldiers wear historically typical khaki uniforms and peaked caps."
                ],
                "creative_decisions": [
                  "Standardizing the military uniforms across all the soldiers to maintain historical accuracy and a cohesive group appearance."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C22O24",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L02B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7ad3c7079459c346"
      },
      {
        "scene_index": 2,
        "heading": "실내. 창고 - 낮",
        "beat_title": "미지의 존재에게 끌려나가는 일본군",
        "representative_moment": "어둠 속으로 강하게 끌려 들어가며 허공에 뜬 C22",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide framing, static shoulder-height observer view, high contrast between daylight interior and pitch-black exterior",
            "t2i_prompt": "Photorealistic cinematic still. In the middle-center background, the dark exterior beyond the doorway creates a stark void. C22O24 in a khaki military tunic and peaked cap, an East Asian adult male, appears in right profile, his body wrenched airborne in mid-action, feet lifted entirely off the wooden threshold, eyes looking off-screen toward the dark exterior. His torso snaps outward, crossing the frame diagonally, the fabric of his uniform pulling taut in the direction of motion. Within the daylight warehouse interior, the pre-existing wall falls into strong contrast against the black void outside. The open door remains visible at the frame edge, partially overlapped by the suspended figure.",
            "outfit_assignments": [
              {
                "character_id": "C22",
                "outlook_id": "O24"
              }
            ],
            "source_facts": [
              "갑자기 휙- 무언가에 끌려나가더니",
              "벌컥 열린 창고 문턱",
              "일본군 병사"
            ],
            "visual_inferences": [
              "Mid-action freeze capturing the exact moment the soldier's feet leave the ground as he is violently pulled.",
              "Khaki military uniform fabric stretching in the direction of the extraction force.",
              "High contrast lighting isolating the dark exterior from the daytime warehouse interior."
            ],
            "creative_decisions": [
              "Wide shot framing from a shoulder-height position just inside the doorway to capture the full body trajectory crossing the threshold.",
              "Emphasizing the off-balance, airborne posture to visually convey the sudden and overwhelming pulling force without showing the entity itself."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "brace",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "The open door remains visible"
              },
              {
                "owned_token": "doorway",
                "usage_kind": "anchor",
                "source_phrase": "beyond the doorway"
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hinge",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "post",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "anchor",
                "source_phrase": "feet lifted entirely off the wooden threshold"
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "the pre-existing wall"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f84b82f2d477b448",
              "owned_hash": "2e3d8a5862b7130f",
              "camera_direction_hash": "af939b6b81b2083b",
              "owned_usage_hash": "201059844336399c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "doorway",
                  "violating_phrase": "beyond the doorway",
                  "reason": "The doorway is mentioned as a spatial reference for the background void with no redraw requested, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "threshold",
                  "violating_phrase": "feet lifted entirely off the wooden threshold",
                  "reason": "The threshold is mentioned only as a spatial reference for the character's feet position, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "the pre-existing wall",
                  "reason": "The wall is explicitly mentioned as pre-existing for lighting contrast with no design changes requested, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "The open door remains visible",
                  "reason": "The door is mentioned only to specify its position at the frame edge and overlap with the character, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 2,
        "dependency_reason": "previous_shot_refs 의 exact_background binding 정책에 따라 직전 샷의 창고 내부 배경과 시공간적 일관성 유지 (인물과 동작만 현재 샷의 순간으로 새롭게 서술)",
        "_shot_index": 5,
        "visible_entities": [
          "C22",
          "L02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a static shoulder-height position just inside the doorway, the camera faces outward and catches the soldiers at the instant their torsos snap toward the exterior and their feet leave the threshold. Their bodies cross the center diagonally, partially overlapping the open door without revealing what is pulling them into the darkness beyond.",
            "lighting_mood": "The daylight warehouse interior falls into strong contrast against the darkness outside the open doorway.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "dark exterior beyond the doorway",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C22",
              "L02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C22",
                "outlook_id": "O24"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L02B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "brace",
              "door",
              "doorway",
              "floor",
              "hinge",
              "post",
              "threshold",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "makeshift_warehouse_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior walls of a makeshift warehouse constructed from roughly assembled wooden planks and mismatched wooden boards. The structure features a crude, unfinished texture with visible gaps and splinters throughout the wooden surfaces.",
                "applies_to_shots": [
                  3,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "판자와 각목 등을 얼기설기 대충 덧대어 만든 가건물",
                  "warehouse interior framing the image edges",
                  "Daylight warehouse interior"
                ],
                "visual_inferences": [
                  "The uneven wooden boards have visible gaps and a coarse texture resulting from crude, improvised construction."
                ],
                "creative_decisions": [
                  "Emphasizing the mismatched wooden planks to highlight the desolate and fragile atmosphere of the shelter."
                ],
                "confidence": "high"
              },
              {
                "element_id": "open_wooden_doorway",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A crude wooden door of the warehouse stands wide open, clearly defining the threshold between the interior and exterior. The open doorway remains completely unobstructed, framing the entrance.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "벌컥 열린 창고 문턱",
                  "opened doorway",
                  "open doorway"
                ],
                "visual_inferences": [
                  "The open door is constructed from the same rough wooden materials as the surrounding warehouse walls."
                ],
                "creative_decisions": [
                  "Keeping the doorway wide open to establish a stark lighting contrast between the inside and outside before the door abruptly shuts in the following sequence."
                ],
                "confidence": "high"
              },
              {
                "element_id": "japanese_soldiers_uniform",
                "element_type": "character_state",
                "character_name": "Japanese soldiers",
                "description": "The men are dressed in standard early 20th-century Imperial Japanese military uniforms, consisting of khaki tunics, trousers, and peaked military caps. They wear standard field gear including leather utility belts.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "일본군 병사",
                  "soldiers"
                ],
                "visual_inferences": [
                  "Based on the early 20th-century colonial setting, the soldiers wear historically typical khaki uniforms and peaked caps."
                ],
                "creative_decisions": [
                  "Standardizing the military uniforms across all the soldiers to maintain historical accuracy and a cohesive group appearance."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 2,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C22O24",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L02B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "293b91d57c57be97"
      },
      {
        "scene_index": 2,
        "heading": "실내. 창고 - 낮",
        "beat_title": "굳게 닫힌 문 앞의 적막과 공포",
        "representative_moment": "굳게 닫힌 창고 문 앞에서 C20이 충격에 빠져 서로에게 기대어 굳어버린 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide eye-level composition with low-key, high-contrast daylight",
            "t2i_prompt": "Photorealistic cinematic still. The closed warehouse door stands in the middle-center background. C20O22 in ragged historical clothes, East Asian historical figures with topknots, braided hair, and starved faces, occupy an uneven middle-ground cluster on the floor. Seen at three-quarter angle from the left, they are half-crouched against one another, their eyes fixed on the door, bodies motionless. The crude wooden planks of the timber frame and wall surround the group, limiting visible depth. Daylight filters sparsely through the gaps, rendering the space with low-key, high-contrast tonal separation that highlights the frozen survivors against the dark interior.",
            "outfit_assignments": [
              {
                "character_id": "C20",
                "outlook_id": "O22"
              }
            ],
            "source_facts": [
              "십여 명 조선인들이 한데 모여 죽음의 공포에 벌벌 떨며 흐느낀다.",
              "쾅!- 나무 문이 닫혀버린다.",
              "뒤이어 다시 크아악- 숨넘어가는 비명… 그리고, 적막."
            ],
            "visual_inferences": [
              "fixed_element makeshift_warehouse_interior: The interior walls of a makeshift warehouse constructed from roughly assembled wooden planks",
              "survivors frozen in a half-crouched cluster staring at the closed door in shock"
            ],
            "creative_decisions": [
              "wide eye-level composition to encompass both the huddled survivors and the central closed door",
              "low-key, high-contrast lighting to emphasize the stark, grim reality of the enclosed space"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "The closed warehouse door stands in the middle-center background."
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "occupy an uneven middle-ground cluster on the floor."
              },
              {
                "owned_token": "timber frame",
                "usage_kind": "anchor",
                "source_phrase": "The crude wooden planks of the timber frame and wall surround the group"
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "The crude wooden planks of the timber frame and wall surround the group"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "121610947613fe49",
              "owned_hash": "b0ad450025abd643",
              "camera_direction_hash": "06351c8c8cee7526",
              "owned_usage_hash": "0918c8dbda274be1",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "The closed warehouse door stands in the middle-center background.",
                  "reason": "The prompt references the door's position in the background as a spatial anchor for the scene, aligning with the producer's anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "occupy an uneven middle-ground cluster on the floor.",
                  "reason": "The floor is used purely as a spatial anchor where the characters are positioned, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "timber frame",
                  "violating_phrase": "The crude wooden planks of the timber frame and wall surround the group",
                  "reason": "The timber frame is mentioned to establish the spatial boundaries enclosing the characters, acting as a compositional anchor as declared.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "The crude wooden planks of the timber frame and wall surround the group",
                  "reason": "The wall is referenced as a background element to limit depth and frame the characters, which is a valid anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 2,
        "dependency_reason": "같은 창고 내부 공간의 배경 연속성 유지 (exact_background)",
        "_shot_index": 6,
        "visible_entities": [
          "C20",
          "L02"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 2,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The camera retreats at eye level along the interior axis until the closed door and the survivors gathered before it resolve together in a wide composition. The survivors occupy an uneven middle-ground cluster, some half-crouched and others recoiling into one another, while the shut door remains centered behind their frozen reactions.",
            "lighting_mood": "Daylight appropriate to the warehouse interior is rendered with low-key, high-contrast tonal separation after the door shuts.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "closed warehouse door",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C20",
              "L02"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C20",
                "outlook_id": "O22"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L02B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "door",
              "floor",
              "timber frame",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "makeshift_warehouse_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior walls of a makeshift warehouse constructed from roughly assembled wooden planks and mismatched wooden boards. The structure features a crude, unfinished texture with visible gaps and splinters throughout the wooden surfaces.",
                "applies_to_shots": [
                  3,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "판자와 각목 등을 얼기설기 대충 덧대어 만든 가건물",
                  "warehouse interior framing the image edges",
                  "Daylight warehouse interior"
                ],
                "visual_inferences": [
                  "The uneven wooden boards have visible gaps and a coarse texture resulting from crude, improvised construction."
                ],
                "creative_decisions": [
                  "Emphasizing the mismatched wooden planks to highlight the desolate and fragile atmosphere of the shelter."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 2,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C20O22",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L02B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7eb37f17cb45440b"
      },
      {
        "scene_index": 3,
        "heading": "3. 실내. 갈대숲 창고 밖 - 낮",
        "beat_title": "검은 형체의 치명상",
        "representative_moment": "A white deer-antler spear violently pierces the chest of C16, whose golden eyes begin to fade.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight close framing at chest height with stark, severe low-key contrast daylight.",
            "t2i_prompt": "Photorealistic cinematic still. In the middle-center midground, C16O00, a supernatural smoke entity, appears as the black smoke figure pierced through the chest. Facing the camera and looking off-screen with a severely injured posture, its human-like head outline features two broken, sharply bent horns, and its glowing golden eyes with rectangular black pupils begin to fade. P01, a white deer-antler-shaped spear, enters from the foreground along the camera's axis and penetrates the center of the chest, with its projecting rear tip clearly visible beyond the offset dark silhouette. The static camera holds the torso in a tight close framing at chest height, pushing the unnaturally elongated arms to the frame edges as scale references. Daylight is shaped into stark, low-key contrast, casting deep dramatic shadows that isolate P01 against the dark torso. The immediate surroundings are completely obscured by [: severe daytime shadows isolating the exterior space].",
            "outfit_assignments": [
              {
                "character_id": "C16",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "A spear flies in and violently pierces the chest of the black figure.",
              "The spearhead protruding from the black figure's back resembles a white deer antler.",
              "The black figure's glowing golden eyes lose their light as it collapses."
            ],
            "visual_inferences": [
              "fixed_element black_smoke_figure_appearance is applied to describe C16's horns, smoke body, and elongated limbs.",
              "fixed_element stark_low_key_daylight is applied to create heavy shadows isolating the chest penetration.",
              "The L02 block is used to represent the frame-edge environment since the background reference is skipped in this close framing."
            ],
            "creative_decisions": [
              "Positioned the camera directly on the spear's axis at chest height to emphasize the penetration impact and depth.",
              "Used stark daylight contrast to make the white antler (P01) pop intensely against the swirling black smoke body."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "prop"
            ],
            "owned_object_usage": [
              {
                "owned_token": "antler",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blood pool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "military equipment",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smoke",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "spear",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tarp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "293c60c9450b9cad",
              "owned_hash": "6de590903ada0530",
              "camera_direction_hash": "48df1c2fdbb7a9bc",
              "owned_usage_hash": "bba70e6d6ba25c03",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 6,
        "visible_entities": [
          "C16",
          "P01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "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 the black figure's chest height, the static camera faces it directly along the spear's path, holding the torso at center in a tight composition. The white antler-shaped shaft enters from the foreground, penetrates the chest on axis, and its projecting rear tip remains visible beyond the figure's offset silhouette, while the elongated limbs stay at the frame edges as scale references.",
            "lighting_mood": "Daylight is shaped into stark, low-key contrast, isolating the white antler-shaped spear against the black figure and retaining the figure's golden eyes.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "black smoke figure pierced through the chest",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C16",
              "P01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C16",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L03B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "black_smoke_figure_appearance",
                "element_type": "character_state",
                "character_name": "검은 형체",
                "description": "An entity formed entirely of thick, swirling black smoke, possessing unnaturally elongated arms and legs compared to a human body. Its head features two broken, sharply bent horns and glowing golden eyes with rectangular black pupils.",
                "applies_to_shots": [
                  6,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "마치 검은 연기가 잔뜩 모여 이루어진 그 형체는 사람에 비해 팔과 다리가 지나치게 긴…",
                  "검은 얼굴 부분에서 반짝이는 황금빛 눈알, 직사각형 까만 동공",
                  "부러진 듯, 꺾인 듯 솟아오른 머리 위 뿔 두 개"
                ],
                "visual_inferences": [],
                "creative_decisions": [],
                "confidence": "high"
              },
              {
                "element_id": "stark_low_key_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The daytime environment is characterized by stark, severe low-key contrast lighting. This intense contrast casts deep, dramatic shadows that isolate the figures against the dark, moody atmosphere.",
                "applies_to_shots": [
                  6,
                  12,
                  15
                ],
                "element_scope": "full",
                "source_facts": [
                  "Daylight is shaped into stark, low-key contrast",
                  "Daylight falls into severe low-key contrast",
                  "Daylight is held in stark low-key contrast"
                ],
                "visual_inferences": [
                  "The harsh shadows naturally draw focus to the glowing accents, like the golden eyes."
                ],
                "creative_decisions": [
                  "Maintain heavy shadows during the daytime to heighten the surreal, horrifying mood of the massacre."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "prop",
                "id": "P01",
                "policy": "required"
              }
            ],
            "forbidden_refs": [
              {
                "kind": "background",
                "reason": "close framing skips chain_bg reference"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [
            {
              "contract_id": "rc_001",
              "scope": {
                "scene_index": 3,
                "shot_indices": [
                  6
                ],
                "duration": "single_shot"
              },
              "targets": [
                {
                  "entity_id": "P01",
                  "role": "visual_target"
                }
              ],
              "requirements": [
                {
                  "dimension": "visual_identity",
                  "operation": "preserve",
                  "strength": "required",
                  "reference_policy": "use_entity_reference"
                }
              ]
            }
          ],
          "_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": "24252d42422a695d"
      },
      {
        "scene_index": 3,
        "heading": "실내. 갈대숲 창고 밖 - 낮",
        "beat_title": "피와 살을 먹으라는 괴물의 저주받은 유언",
        "representative_moment": "The black smoke figure grips the Joseon village head's neck, pulling him close for a final whisper.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "lateral dolly-in close two-shot at face height, severe low-key contrast",
            "t2i_prompt": "Photorealistic cinematic still. Captured at face height in a tight close two-shot, C16O00, an entity formed entirely of thick swirling black smoke with unnaturally elongated arms, reaches from a collapsed posture at three-quarter angle from the left. Its head, featuring two broken sharply bent horns and fading golden eyes with rectangular black pupils, is pulled intimately close to a mid-50s East Asian man with a topknot in traditional Joseon commoner clothing. The man's rounded face is seen in right profile, his chin tucked down as C16O00's smoky hand firmly grips his throat. The man's eyes are fixed on C16O00. Severe low-key contrast daylight casts deep, dramatic shadows that swallow the lower and outer edges of the frame, leaving the fading golden eyes as the only sharp color accent. The softly blurred texture of a wooden warehouse exterior is barely visible at the dark background edge.",
            "outfit_assignments": [
              {
                "character_id": "C16",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "The lateral dolly-in pauses at face height at its closest point, compressing the village head and the black figure into an intimate two-shot.",
              "The village head occupies one side in profile with his chin drawn down, while the figure's long gripping arm crosses between them.",
              "Daylight falls into severe low-key contrast, with the black figure's fading golden eyes providing the only specified color accent."
            ],
            "visual_inferences": [
              "fixed_element black_smoke_figure_appearance: C16 formed of thick black smoke, elongated arms, broken horns, rectangular black pupils",
              "fixed_element joseon_village_head_demographics: mid-50s Joseon man in commoner clothing (rendered as generic descriptor per id_policy)",
              "fixed_element stark_low_key_daylight: dramatic shadows isolating the figures",
              "immobilized subject continuity: chest impalement is off-frame to adhere strictly to the face-height close two-shot camera rule"
            ],
            "creative_decisions": [
              "Rendered C18 as a generic demographic descriptor per the 'generic_descriptor_allowed' policy, avoiding C18 ID.",
              "Used a soft, dark wooden texture at the background edge to represent the skipped background reference without distracting from the forced communion."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "antler",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blood pool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "military equipment",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smoke",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "spear",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tarp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7f118ea5c83bc450",
              "owned_hash": "6de590903ada0530",
              "camera_direction_hash": "8c631347dceaa803",
              "owned_usage_hash": "bba70e6d6ba25c03",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 3,
        "dependency_reason": "Continuity of lighting and environment from prior shots, focusing tightly on the same fallen entity.",
        "_shot_index": 12,
        "visible_entities": [
          "C16",
          "C18"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The lateral dolly-in pauses at face height at its closest point, compressing the village head and the black figure into an intimate two-shot. The village head occupies one side in profile with his chin drawn down, while the figure's long gripping arm crosses between them and pulls his throat toward its fading golden eyes on the opposite side.",
            "lighting_mood": "Daylight falls into severe low-key contrast, with the black figure's fading golden eyes providing the only specified color accent near the locked faces.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C16",
              "C18"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C18",
                "outlook_id": "O20"
              },
              {
                "character_id": "C16",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [
              {
                "subject_id": "C18",
                "policy_type": "identity_reference",
                "policy": "generic_descriptor_allowed",
                "reason": "visible_shot_count=1 — selected-shot 저빈도 주변 subject"
              }
            ],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L03B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "black_smoke_figure_appearance",
                "element_type": "character_state",
                "character_name": "검은 형체",
                "description": "An entity formed entirely of thick, swirling black smoke, possessing unnaturally elongated arms and legs compared to a human body. Its head features two broken, sharply bent horns and glowing golden eyes with rectangular black pupils.",
                "applies_to_shots": [
                  6,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "마치 검은 연기가 잔뜩 모여 이루어진 그 형체는 사람에 비해 팔과 다리가 지나치게 긴…",
                  "검은 얼굴 부분에서 반짝이는 황금빛 눈알, 직사각형 까만 동공",
                  "부러진 듯, 꺾인 듯 솟아오른 머리 위 뿔 두 개"
                ],
                "visual_inferences": [],
                "creative_decisions": [],
                "confidence": "high"
              },
              {
                "element_id": "joseon_village_head_demographics",
                "element_type": "character_state",
                "character_name": "조선인 촌주",
                "description": "A mid-50s Joseon man with the traditional, rustic physical appearance of a village head. He wears period-appropriate Korean commoner or local leader clothing, maintaining this fundamental demographic baseline.",
                "applies_to_shots": [
                  12,
                  15
                ],
                "element_scope": "full",
                "source_facts": [
                  "50 중반 조선인 남자: 촌주 같아 보이는 자."
                ],
                "visual_inferences": [
                  "Wears rustic, traditional Joseon period attire suitable for a village leader."
                ],
                "creative_decisions": [],
                "confidence": "high"
              },
              {
                "element_id": "stark_low_key_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The daytime environment is characterized by stark, severe low-key contrast lighting. This intense contrast casts deep, dramatic shadows that isolate the figures against the dark, moody atmosphere.",
                "applies_to_shots": [
                  6,
                  12,
                  15
                ],
                "element_scope": "full",
                "source_facts": [
                  "Daylight is shaped into stark, low-key contrast",
                  "Daylight falls into severe low-key contrast",
                  "Daylight is held in stark low-key contrast"
                ],
                "visual_inferences": [
                  "The harsh shadows naturally draw focus to the glowing accents, like the golden eyes."
                ],
                "creative_decisions": [
                  "Maintain heavy shadows during the daytime to heighten the surreal, horrifying mood of the massacre."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 3,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "23b5316aaefc3212"
      },
      {
        "scene_index": 3,
        "heading": "3. 실내. 갈대숲 창고 밖 - 낮",
        "beat_title": "촌주의 각성과 기괴한 변화",
        "representative_moment": "황금빛 눈동자로 변한 C19O21이 프레임 하단의 생존자들 어깨 너머로 카메라 렌즈 옆을 꿰뚫어보듯 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye level close view, stark low-key contrast lighting",
            "t2i_prompt": "Photorealistic cinematic still. C19O21 in a rustic period-appropriate Joseon tunic, an Asian man in his 50s, appears as the transformed village head in the middle-center midground. Captured at eye level in a tight close view, his round middle-aged face is nearly facing the camera, with his topknot black hair blending into the heavy darkness. His non-human, transformed golden eyes form a concentrated color accent, looking just past the lens off-screen. Softly blurred shoulders of the emerging survivors occupy the lower frame edges in the foreground, establishing whom he watches. Daylight is held in stark low-key contrast, casting deep dramatic shadows across his jawline and isolating the figure against the moody atmosphere. [: An exterior-facing open doorway partially visible behind the blurred shoulders at the frame edge].",
            "outfit_assignments": [
              {
                "character_id": "C19",
                "outlook_id": "O21"
              }
            ],
            "source_facts": [
              "이들을 바라보는 촌주의 두 눈이 황금빛으로 변한다.",
              "50 중반 조선인 남자: 촌주 같아 보이는 자.",
              "shot description: At eye level among the emerging survivors, the final dolly-in ends on a close view of the village head's face."
            ],
            "visual_inferences": [
              "fixed_element joseon_village_head_demographics: wears traditional, rustic physical appearance and commoner clothing",
              "fixed_element stark_low_key_daylight: stark, severe low-key contrast lighting isolates the figures against dark moody atmosphere",
              "blurred shoulders at the lower edge represent the survivors from the prior shot"
            ],
            "creative_decisions": [
              "golden eyes act as a single concentrated color accent against the heavy shadows to emphasize the supernatural shift",
              "positioning the survivors as out-of-focus foreground elements to anchor spatial depth without drawing attention away from the village head's face"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "antler",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blood pool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "military equipment",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smoke",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "spear",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tarp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "9669cfd882b23a2e",
              "owned_hash": "6de590903ada0530",
              "camera_direction_hash": "4a76d6a777a84a5d",
              "owned_usage_hash": "bba70e6d6ba25c03",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 3,
        "dependency_reason": "Same continuous space and time outside the warehouse; lighting and subject identity carry over from the preceding moments.",
        "_shot_index": 15,
        "visible_entities": [
          "C19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 3,
            "shot_index": 15
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level among the emerging survivors, the final dolly-in ends on a close view of the village head's face, with blurred survivor shoulders retained at the lower frame edges to establish whom he watches. His face is nearly frontal for confrontation rather than portraiture, but his transformed golden eyes look just past the lens toward the surrounding survivors.",
            "lighting_mood": "Daylight is held in stark low-key contrast while the village head's transformed golden eyes become the concentrated color accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "transformed village head",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C19"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C19",
                "outlook_id": "O21"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L03B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "joseon_village_head_demographics",
                "element_type": "character_state",
                "character_name": "조선인 촌주",
                "description": "A mid-50s Joseon man with the traditional, rustic physical appearance of a village head. He wears period-appropriate Korean commoner or local leader clothing, maintaining this fundamental demographic baseline.",
                "applies_to_shots": [
                  12,
                  15
                ],
                "element_scope": "full",
                "source_facts": [
                  "50 중반 조선인 남자: 촌주 같아 보이는 자."
                ],
                "visual_inferences": [
                  "Wears rustic, traditional Joseon period attire suitable for a village leader."
                ],
                "creative_decisions": [],
                "confidence": "high"
              },
              {
                "element_id": "stark_low_key_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The daytime environment is characterized by stark, severe low-key contrast lighting. This intense contrast casts deep, dramatic shadows that isolate the figures against the dark, moody atmosphere.",
                "applies_to_shots": [
                  6,
                  12,
                  15
                ],
                "element_scope": "full",
                "source_facts": [
                  "Daylight is shaped into stark, low-key contrast",
                  "Daylight falls into severe low-key contrast",
                  "Daylight is held in stark low-key contrast"
                ],
                "visual_inferences": [
                  "The harsh shadows naturally draw focus to the glowing accents, like the golden eyes."
                ],
                "creative_decisions": [
                  "Maintain heavy shadows during the daytime to heighten the surreal, horrifying mood of the massacre."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 3,
                "shot_index": 12,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C19O21",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "d79e36b3dceefd94"
      },
      {
        "scene_index": 4,
        "heading": "실내. 달리는 퇴근 버스 - 밤",
        "beat_title": "피로에 지친 퇴근길",
        "representative_moment": "C01이 달리는 버스의 창가 자리에 피곤하게 기대어 밖을 바라보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Wide horizontal track shot from seated eye level on the aisle side, high-contrast neon against low-key blue-black ambient.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in casual workwear, a young East Asian woman with long black hair and a pale oval face, is at the window seat in the middle-right midground, while passing city lights beyond the bus window streak horizontally in the middle-left background. Viewed from a seated eye level on the aisle side in a wide horizontal composition, C01O01 is slumped into the seat in right profile, her gaze directed off-screen with a deeply exhausted expression. The dark bus interior features rows of seats receding into the rear, occupied by a few unnamed Asian middle-aged commuters providing scale deeper along the aisle. Restrained, high-contrast neon illumination from the moving cityscape outside washes over the space, leaving C01O01's fatigued face subdued in a low-key, blue-black moody ambient shadow.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "창가 자리, 지후 역시 피곤에 절은 모습인데…",
              "차창 밖으로 도심 네온싸인, 잡다한 불빛들이 어지러이 스쳐 지나간다",
              "profile_right, slumped into window seat, gaze=off_screen",
              "From seated eye level on the aisle side... wide horizontal composition"
            ],
            "visual_inferences": [
              "fixed_element ji_hoo_window_seat: right-facing profile, deep exhaustion",
              "fixed_element nighttime_bus_window_environment: low-key, blue-black moody illumination",
              "other exhausted workers provide scale deeper along the aisle"
            ],
            "creative_decisions": [
              "Wide aisle-side perspective to emphasize the contrast between the static, isolated interior and dynamic city lights outside",
              "Subdued facial lighting applied to C01O01 to reflect late-night fatigue and apathy"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bus",
                "usage_kind": "anchor",
                "source_phrase": "dark bus interior"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "seat",
                "usage_kind": "anchor",
                "source_phrase": "slumped into the seat"
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "beyond the bus window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "22e29de83f91e3b5",
              "owned_hash": "77fe358c5a02a870",
              "camera_direction_hash": "14cf459720d8e7c1",
              "owned_usage_hash": "6eead88c2ae68339",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bus",
                  "violating_phrase": "dark bus interior",
                  "reason": "The bus is referenced purely as the ambient environment and background setting without any instruction to redraw or alter it, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "seat",
                  "violating_phrase": "slumped into the seat",
                  "reason": "The seat is referenced as a physical anchor for the character's pose and composition depth without requesting any redesign, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "beyond the bus window",
                  "reason": "The window is used as a spatial frame to describe the background cityscape light streaks, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 4,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From seated eye level on the aisle side, the camera begins a parallel track along the window seats in a wide horizontal composition, keeping 김지후(강수리영) anchored at the window side of the frame. His seated profile and tired face remain stable in the midground while the passing city lights stretch into long horizontal trajectories beyond the bus window and other exhausted workers provide scale deeper along the aisle.",
            "lighting_mood": "Nighttime city neon and miscellaneous exterior lights pass across the bus interior in restrained, high-contrast color, leaving Ji-hoo's fatigued face subdued.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "Ji-hoo at the window seat",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "passing city lights beyond the bus window",
                  "screen_zone": "middle_left",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L11B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bus",
              "door",
              "seat",
              "smartphone",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "ji_hoo_window_seat",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young East Asian woman in her early twenties is seated in a dark bus seat directly adjacent to a large window. She consistently maintains a right-facing profile orientation relative to the camera, which views her from the aisle side. She wears practical, casual attire suitable for a logistics warehouse worker, and her face displays deep exhaustion.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "창가 자리, 지후",
                  "profile_right",
                  "물류센터 노동자들",
                  "곧 23번째 생일이잖아"
                ],
                "visual_inferences": [
                  "Her clothing is casual and slightly worn, reflecting her physically demanding job.",
                  "She sits on the right side of the bus interior based on the right-facing profile against the window."
                ],
                "creative_decisions": [
                  "Her face is kept somewhat subdued in the shadows to emphasize a profound sense of late-night fatigue and apathy."
                ],
                "confidence": "high"
              },
              {
                "element_id": "nighttime_bus_window_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a dark, moving commuter bus featuring a wide window on the right side of the composition. Through the glass, a nighttime cityscape is visible, characterized by high-contrast urban neon signs and exterior lights that streak horizontally as the vehicle moves. The ambient interior space maintains a low-key, blue-black moody illumination.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "달리는 퇴근 버스 - 밤",
                  "차창 밖으로 도심 네온싸인, 잡다한 불빛들이 어지러이 스쳐 지나간다",
                  "Nighttime city neon and miscellaneous exterior lights",
                  "low-key nighttime bus illumination"
                ],
                "visual_inferences": [
                  "The bus window has standard dark rubber transit framing that slightly reflects the passing exterior lights."
                ],
                "creative_decisions": [
                  "The stark contrast between the vibrant, streaking city lights outside and the moody blue-black darkness inside is utilized to heighten the feeling of urban isolation."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L11B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "884c44b00e6705dd"
      },
      {
        "scene_index": 4,
        "heading": "실내. 달리는 퇴근 버스 - 밤",
        "beat_title": "숨막히는 압박감",
        "representative_moment": "P10 화면 전체를 빼곡히 채운 절박한 메시지들과 부재중 통화 기록의 인서트 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Insert shot directly above the screen, edge-to-edge framing, luminous contrast against blue-black ambient",
            "t2i_prompt": "Photorealistic cinematic still. The active screen of P10, a modern smartphone, fills the frame edge-to-edge with a subtle digital pixel texture. The glowing touchscreen interface presents a densely populated vertical layout of incoming message bubbles and a continuous column of missed call notifications, completely lacking any outgoing reply bubbles. The screen's luminous contrast dominates the composition, leaving only a razor-thin trace of the dark bezel and the low-key blue-black void of the nighttime bus interior barely visible at the extreme outer boundaries.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: A close-up of the phone screen completely filled with Mom's desperate messages and dozens of missed call records.",
              "DP directive: camera from directly above the phone and nearly perpendicular, static isolated insert with the active screen running edge to edge.",
              "P10 physical form contract: hand-sized modern smartphone, dynamic touchscreen showing densely populated messaging and call-history interface."
            ],
            "visual_inferences": [
              "Digital pixel texture is applied to fulfill the 'through_device' perception mode while focusing purely on screen contents.",
              "The background is pushed to extreme outer boundaries as a dark void to maintain the requested edge-to-edge screen scale."
            ],
            "creative_decisions": [
              "Described the UI structurally (incoming message bubbles, missed call notifications, no outgoing replies) to evoke the narrative tension without forcing exact foreign text generation.",
              "Emphasized the luminous contrast of the display against the minimal dark bezel to match the DP's lighting mood."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bus",
                "usage_kind": "anchor",
                "source_phrase": "the nighttime bus interior"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "redraw",
                "source_phrase": "The active screen of P10, a modern smartphone"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "dcb8c294750d8859",
              "owned_hash": "77fe358c5a02a870",
              "camera_direction_hash": "9df32ae350c191fa",
              "owned_usage_hash": "b9b9e1c479ce27cf",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bus",
                  "violating_phrase": "the nighttime bus interior barely visible",
                  "reason": "The bus is referenced solely as a dark background environment to frame the close-up shot, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "The active screen of P10, a modern smartphone, fills the frame edge-to-edge with a subtle digital pixel texture",
                  "reason": "The prompt specifies the glowing interface and message layout of the smartphone screen, which is explicitly and structurally required by the shot_intent showing the desperate messages and missed calls.",
                  "verdict": "allowed_visual_state_change"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "exact_background (이전 샷과 동일한 버스 내부 배경의 연속선상에서 폰 화면으로 인서트)",
        "_shot_index": 4,
        "visible_entities": [
          "P10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 4,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From directly above the phone and nearly perpendicular to its display, hold a static isolated insert with the active screen running edge to edge and only a trace of bezel at the boundary. Keep the desperate messages, the absence of any reply, and the dense missed-call history simultaneously legible, preserving the flow's intimate observational position.",
            "lighting_mood": "The phone display provides restrained luminous contrast within the explicitly nighttime bus setting, with an otherwise low-key blue-black mood.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "P10"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L11B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bus",
              "door",
              "seat",
              "smartphone",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L11B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "c432dca00f237509"
      },
      {
        "scene_index": 4,
        "heading": "실내. 달리는 퇴근 버스 - 밤",
        "beat_title": "일상에 스며든 불길한 징조",
        "representative_moment": "피로에 지쳐 고개를 숙인 C01 옆 차창에 황금색 눈을 가진 검은 연기 형상이 스치듯 맺힌다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium shot at eye level from the aisle, framing the seated character on the left and the expansive window on the right with low-key blue-black lighting.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a young East Asian woman in her early twenties with a pretty oval face, long straight black hair, and a pale impression, is seated in the lower-left midground. She rests in right profile, hunched over her knees in a dark bus seat, her gaze directed down in exhaustion. Next to her, stretching across the upper-right half of the composition, a large window reflects the moody blue-black interior. Coalescing on the surface of the window glass is a faint black smoke forming a human-like face facing the camera, its explicitly golden eyes fixed directly on the camera. Outside the window, passing urban neon lights streak horizontally through the darkness, contrasting against the low-key nighttime ambient illumination of the bus.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S4 action: '차창에 스르륵 검은 연기가 맺히는가 싶더니… 사람 얼굴 같은 형상, 황금색 눈알의 이미지가 되었다가 다시 사라진다.'",
              "shot description: 고개를 숙인 김지후 옆의 버스 창문 유리에 황금색 눈알을 지닌 사람 얼굴 형상의 그분이 흐릿하게 맺혀 있는 모습"
            ],
            "visual_inferences": [
              "fixed_element ji_hoo_window_seat: C01O01 seated in a dark bus seat directly adjacent to a large window, right-facing profile",
              "fixed_element nighttime_bus_window_environment: interior of a dark commuter bus with a wide window showing nighttime cityscape",
              "The supernatural entity appears as a transparent reflection or condensation on the window pane, its gaze unnervingly directed at the camera lens rather than the character."
            ],
            "creative_decisions": [
              "Placed C01 in the lower-left midground and the supernatural window reflection on the upper-right to maximize the spatial tension within the medium framing.",
              "Contrast the striking golden eyes of the apparition against the cool blue-black ambient tone of the bus interior to highlight the sudden threat."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "aisle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "handrail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "seat",
                "usage_kind": "anchor",
                "source_phrase": "hunched over her knees in a dark bus seat"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "a large window reflects the moody blue-black interior"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d41927fbc3023eb2",
              "owned_hash": "dee1e5eb82e99e6f",
              "camera_direction_hash": "127d92e69afa6ced",
              "owned_usage_hash": "cc77eddfde8a05f8",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "seat",
                  "violating_phrase": "hunched over her knees in a dark bus seat",
                  "reason": "The prompt references the bus seat as a spatial anchor to position the tired character, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "Coalescing on the surface of the window glass is a faint black smoke forming a human-like face",
                  "reason": "The appearance of a faint smoky face with golden eyes on the window glass is explicitly required by the shot intent ('차창에 황금색 눈을 가진 검은 연기 형상이 스치듯 맺힌다') and qualifies as an allowed visual state change on the surface of the existing window.",
                  "verdict": "allowed_visual_state_change"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "Same room/space as Scene 4 Shot 1, requiring exact background consistency for the nighttime bus interior.",
        "_shot_index": 8,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 4,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the track at 김지후(강수리영)'s seated eye level from the aisle side, holding her lowered side profile in the lower-left while the adjacent bus window remains open across the upper-right half of the composition. Keep her in firm focus and let the faint face-like black form on the glass remain slightly soft, with its golden eyes clear enough to register as the concealed threat she fails to notice.",
            "lighting_mood": "Low-key nighttime bus illumination is punctuated by passing urban neon and the apparition's explicitly golden eyes against a blue-black frame.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김지후(강수리영)",
                  "screen_zone": "lower_left",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L11B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "aisle",
              "ceiling light",
              "handrail",
              "seat",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "ji_hoo_window_seat",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young East Asian woman in her early twenties is seated in a dark bus seat directly adjacent to a large window. She consistently maintains a right-facing profile orientation relative to the camera, which views her from the aisle side. She wears practical, casual attire suitable for a logistics warehouse worker, and her face displays deep exhaustion.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "창가 자리, 지후",
                  "profile_right",
                  "물류센터 노동자들",
                  "곧 23번째 생일이잖아"
                ],
                "visual_inferences": [
                  "Her clothing is casual and slightly worn, reflecting her physically demanding job.",
                  "She sits on the right side of the bus interior based on the right-facing profile against the window."
                ],
                "creative_decisions": [
                  "Her face is kept somewhat subdued in the shadows to emphasize a profound sense of late-night fatigue and apathy."
                ],
                "confidence": "high"
              },
              {
                "element_id": "nighttime_bus_window_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a dark, moving commuter bus featuring a wide window on the right side of the composition. Through the glass, a nighttime cityscape is visible, characterized by high-contrast urban neon signs and exterior lights that streak horizontally as the vehicle moves. The ambient interior space maintains a low-key, blue-black moody illumination.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "달리는 퇴근 버스 - 밤",
                  "차창 밖으로 도심 네온싸인, 잡다한 불빛들이 어지러이 스쳐 지나간다",
                  "Nighttime city neon and miscellaneous exterior lights",
                  "low-key nighttime bus illumination"
                ],
                "visual_inferences": [
                  "The bus window has standard dark rubber transit framing that slightly reflects the passing exterior lights."
                ],
                "creative_decisions": [
                  "The stark contrast between the vibrant, streaking city lights outside and the moody blue-black darkness inside is utilized to heighten the feeling of urban isolation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L11B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "c98635acfb15bb33"
      },
      {
        "scene_index": 5,
        "heading": "6. 실내. 편의점 냉장고 - 밤",
        "beat_title": "핏방울에 넋이 나간 지후",
        "representative_moment": "파란 조끼를 입은 C01이 코를 막고 선 채, 하얀 타일 바닥에 떨어진 핏방울을 매료된 듯 내려다보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium framing from upper-torso height with a slight downward tilt, shallow focus on the mesmerized expression, low-key cool-toned night lighting",
            "t2i_prompt": "Photorealistic cinematic still. Medium framing from an upper-torso height in the rear walk-in refrigerator space, tilting slightly downward. C01O01 in a blue work vest, a young pale Korean woman in her early 20s with long straight black hair, stands in three-quarter left profile. She is leaning forward, her fingers pinching her nose, her vacant and drained face holding a transfixed expression. She is looking down, her eyes fixed on a single dark-red drop of blood resting on the white tile floor near the lower frame edge. Shallow focus sharply captures her mesmerized face, while rows of closely packed beverage cans form a continuous physical barrier along the refrigerator shelves in the soft background, their fronts angled away obliquely. A basket of discarded food sits in the dim rear space behind her. The scene features consistent nighttime convenience store illumination, casting a low-key, cool-toned ambient light that isolates her pale features and the blood drop.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Shot 4: 김지후가 매료된 듯 넋이 나간 표정으로 바닥에 떨어진 검붉은 핏방울을 뚫어지게 내려다보는 모습.",
              "Scene text: 본능적으로 코를 막는 지후... 그 검붉은색에 흠뻑 매료된 것처럼...",
              "Outfit: 똑같은 파란색 조끼를 입고"
            ],
            "visual_inferences": [
              "fixed_element refrigerator_night_lighting: low-key and cool-toned atmosphere within the walk-in refrigerator space",
              "fixed_element stocked_beverage_shelves: rows of closely packed beverage cans arranged along the shelves as a continuous physical barrier",
              "Camera tilts downward to logically frame the floor (blood drop) at the bottom while keeping the torso/head in the medium frame."
            ],
            "creative_decisions": [
              "Applied shallow focus to emphasize her transfixed, vacant expression while softening the background cans.",
              "Placed the blood drop precisely near the lower frame edge to match the downward gaze and camera tilt."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a6616afae8739de5",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "2fb7888483f050ed",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "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 the rear refrigerator space at upper-torso height, continue a restrained dolly toward 김지후(강수리영) on a three-quarter side angle, framing her vacant face prominently while tilting just enough downward to retain the dark-red blood drop near the lower edge. Use shallow focus on her transfixed expression, allowing the drop to remain a distinct but secondary point along her downward eyeline.",
            "lighting_mood": "Low-key ambient illumination appropriate to the nighttime convenience-store interior isolates the dark-red blood and 지후's drained expression without specifying an unestablished source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "refrigerator_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene features consistent nighttime convenience store illumination. The ambient light creates a slightly low-key and cool-toned atmosphere within the walk-in refrigerator space. This lighting seamlessly connects the dimly lit rear storage area with the brighter storefront visible through the glass.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key ambient illumination appropriate to the nighttime convenience-store interior",
                  "Ambient convenience-store illumination appropriate to the nighttime setting"
                ],
                "visual_inferences": [
                  "The lighting has a cool temperature typical of commercial walk-in refrigerators.",
                  "The light intensity differs slightly between the rear space and the front display."
                ],
                "creative_decisions": [
                  "Maintaining a subdued, atmospheric lighting to highlight the eerie mood before and during the character's interaction."
                ],
                "confidence": "high"
              },
              {
                "element_id": "stocked_beverage_shelves",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "Rows of closely packed beverage cans are arranged along the refrigerator display shelves. These stocked drinks form a continuous physical barrier separating the interior walk-in storage area from the main store floor. They serve as a framing and spatial reference throughout the scene.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "각종 캔 음료들이 꽉 들어찬 냉장고 뒤편 빈 공간",
                  "narrow opening between closely stocked drinks",
                  "nearer cans remain soft along both sides"
                ],
                "visual_inferences": [
                  "The cans are standard commercial sizes placed tightly together to maximize display space."
                ],
                "creative_decisions": [
                  "Using the stocked cans as a visual tunnel and spatial boundary to establish depth."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "acc94b984486f3d7"
      },
      {
        "scene_index": 5,
        "heading": "실내. 편의점 냉장고 - 밤",
        "beat_title": "냉장고 밖 불청객의 등장",
        "representative_moment": "An Asian young man smiles brightly through the narrow gap between beverage cans outside the refrigerator glass door.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "close framing through a narrow gap, object POV from inside the refrigerator, cool-toned ambient lighting",
            "t2i_prompt": "Photorealistic cinematic still. In the middle-center foreground, out-of-focus drink rows flanking a narrow central opening form a tight visual tunnel. Through the transparent refrigerator glass door positioned just beyond the gap, an Asian young man in his 20s in a casual jacket is leaning toward the glass, facing the camera. His smiling face is framed precisely within the central gap, eyes fixed on the observer behind the lens. The scene is lit by cool-toned ambient convenience-store illumination, keeping his expression bright and readable against the brighter storefront background, while the softly blurred foreground beverage cans on both sides fall into restrained shadow.",
            "outfit_assignments": [],
            "source_facts": [
              "S5 action: '냉장고 유리문 밖에서 훤칠하게 잘 생긴 20대 남자가 웃고 있다.'",
              "shot description: 정인우's smiling face sits tightly in the central gap, while the nearer cans remain soft along both sides as a visual tunnel toward him"
            ],
            "visual_inferences": [
              "fixed_element refrigerator_night_lighting: The ambient light creates a slightly low-key and cool-toned atmosphere within the walk-in refrigerator space, connecting with the brighter storefront.",
              "fixed_element stocked_beverage_shelves: Rows of closely packed beverage cans form a continuous physical barrier and spatial reference."
            ],
            "creative_decisions": [
              "Used heavy depth-of-field blur on the foreground cans to force attention entirely on the smiling face outside the glass.",
              "Applied a subtle cool cast on the shadow areas of the cans to match the walk-in cooler environment, contrasting with the brighter store exterior."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b8993bc95a862bf4",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "49962ac2444a755b",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 5,
        "dependency_reason": "Maintains the nighttime convenience-store illumination and the arrangement of stocked beverage shelves established in earlier shots of the same scene.",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 5,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Settle the lateral track inside the refrigerator display at face height, looking outward through the glass and a narrow opening between closely stocked drinks. 정인우's smiling face sits tightly in the central gap, while the nearer cans remain soft along both sides as a visual tunnel toward him; 김지후(강수리영) remains behind the camera in the rear space.",
            "lighting_mood": "Ambient convenience-store illumination appropriate to the nighttime setting keeps 인우's smile readable through the glass while the foreground drinks fall into restrained contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "drink rows flanking a narrow central opening",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "refrigerator_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene features consistent nighttime convenience store illumination. The ambient light creates a slightly low-key and cool-toned atmosphere within the walk-in refrigerator space. This lighting seamlessly connects the dimly lit rear storage area with the brighter storefront visible through the glass.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key ambient illumination appropriate to the nighttime convenience-store interior",
                  "Ambient convenience-store illumination appropriate to the nighttime setting"
                ],
                "visual_inferences": [
                  "The lighting has a cool temperature typical of commercial walk-in refrigerators.",
                  "The light intensity differs slightly between the rear space and the front display."
                ],
                "creative_decisions": [
                  "Maintaining a subdued, atmospheric lighting to highlight the eerie mood before and during the character's interaction."
                ],
                "confidence": "high"
              },
              {
                "element_id": "stocked_beverage_shelves",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "Rows of closely packed beverage cans are arranged along the refrigerator display shelves. These stocked drinks form a continuous physical barrier separating the interior walk-in storage area from the main store floor. They serve as a framing and spatial reference throughout the scene.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "각종 캔 음료들이 꽉 들어찬 냉장고 뒤편 빈 공간",
                  "narrow opening between closely stocked drinks",
                  "nearer cans remain soft along both sides"
                ],
                "visual_inferences": [
                  "The cans are standard commercial sizes placed tightly together to maximize display space."
                ],
                "creative_decisions": [
                  "Using the stocked cans as a visual tunnel and spatial boundary to establish depth."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 5,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "5739f9526a0c9658"
      },
      {
        "scene_index": 6,
        "heading": "7. 실외. 편의점 밖 - 밤",
        "beat_title": "인우와 농담을 주고받는 여유로움 → 엄마가 자신을 찾아다니는 상황 인지",
        "representative_moment": "한 손에 캔커피를 쥔 채 까만 밤하늘을 올려다보며 입술을 동그랗게 모으고 있는 김지후(강수리영)의 측면.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Seated eye-level close framing isolating the right-facing profile",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a young Korean woman with long black straight hair and a pale face, captured in right profile at seated eye level, torso and head filling the frame. Her chin is noticeably tilted upward, looking up. Her lips are rounded, carrying the focal emphasis on her face. She holds an opened canned coffee low in her hand near the bottom edge. [: A small field of open dark night sky fills the negative space above her lifted eyeline; natural low-key ambient light shapes a dim profile, preserving facial volume against the deep shadows of the immediate surroundings].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "한 손에 캔커피를 쥔 채 까만 밤하늘을 올려다보며 입술을 동그랗게 모으고 있는 김지후(강수리영)의 측면.",
              "seated, chin tilted upward, gaze=up",
              "opened canned coffee retained low in frame"
            ],
            "visual_inferences": [
              "fixed_element jihu_bench_posture applied: C01O01 seated with chin noticeably tilted upward",
              "Right profile emphasizes the rounded lips for whistling and the upward gaze toward the sky",
              "Close framing omits the background reference, leaving only the sky and immediate dark surroundings visible"
            ],
            "creative_decisions": [
              "Positioning the canned coffee in the lower frame edge to serve as a compact scale reference without cluttering the close-up on the face",
              "Applying natural low-key ambient lighting to create a moody, dim profile consistent with the nighttime convenience store exterior"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "convenience store",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outdoor unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pavement",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trash can",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "fcbd0541b0eb0848",
              "owned_hash": "57fda89002a08a35",
              "camera_direction_hash": "2d938311290e40ab",
              "owned_usage_hash": "dfa4cef496175255",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "Not directly continuing a previously rendered moment in the exact same framing, rendering as an isolated close profile.",
        "_shot_index": 3,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 6,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "End the dolly-in beside the bench at seated eye level, isolating 김지후(강수리영)'s right-facing side profile while leaving a small field of open night sky above her lifted eyeline. Her rounded lips and raised chin carry the focal emphasis, with the opened canned coffee retained low in frame as a compact scale reference.",
            "lighting_mood": "Natural ambient light appropriate to the nighttime convenience-store exterior shapes a low-key profile against the dark sky without introducing an unestablished source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L06B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "convenience_store_bench",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor bench situated in front of a convenience store at night. The surrounding area is dimly illuminated by natural, low-key ambient nighttime lighting, framed against a vast and dark night sky.",
                "applies_to_shots": [
                  3,
                  4,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 편의점 밖 - 밤",
                  "벤치에 나란히 앉은 두 사람",
                  "Natural ambient light appropriate to the nighttime exterior"
                ],
                "visual_inferences": [
                  "A standard outdoor wooden or metal bench, slightly illuminated by the indirect glow of the nearby convenience store."
                ],
                "creative_decisions": [
                  "Maintaining a heavy blue-black palette and low-key contrast to emphasize the darkness of the night sky above."
                ],
                "confidence": "high"
              },
              {
                "element_id": "jihu_bench_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young Korean woman seated on an outdoor bench. Her chin is noticeably tilted upward as she gazes high into the dark night sky. She holds an opened canned coffee low in her hand.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "한 손에 캔커피를 쥔 채 까만 밤하늘을 올려다보며",
                  "seated, chin tilted upward, gaze=up",
                  "opened canned coffee retained low in frame"
                ],
                "visual_inferences": [
                  "Her posture is relaxed but physically anchored to the bench, with the coffee can serving as a compact scale reference near her lap or lower torso."
                ],
                "creative_decisions": [
                  "The upward tilt of her head creates a distinct profile or three-quarter silhouette against the dark sky."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "844d85fe4ca53852"
      },
      {
        "scene_index": 6,
        "heading": "실외. 편의점 밖 - 밤",
        "beat_title": "정색하는 인우",
        "representative_moment": "인우(C03)가 갑작스러운 휘파람 소리에 놀라 굳은 표정으로 옆자리의 지후를 돌아보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing at seated eye level, isolating the left-facing profile in low-key nighttime contrast.",
            "t2i_prompt": "Photorealistic cinematic still. [: Close framing at seated eye level, the frame-edge surface showing only the backrest of an outdoor bench against a vast, dark night sky, illuminated by dim natural ambient lighting in a restrained blue-black palette]. C03O03 in a dark jacket, a handsome Korean man in his 20s, is framed in left profile, twisting his upper body sharply on the shared bench to lock his gaze entirely on the woman beside him. His expression is hardened and arresting in the low-key contrast. Occupying the opposite right edge of the frame, a young Korean woman in her 20s appears as a soft, out-of-focus three-quarter fragment at a three-quarter angle from the right, seated with her chin raised, looking up into the night sky. The open canned coffee she holds is partially visible near the lower right frame edge. The shared bench runs laterally through the lower frame, physically linking his rigid posture and her relaxed, soft-focus form.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S6 action: 정인우가 정색하며 김지후를 똑바로 쳐다보는 옆얼굴",
              "S6 context: 야외 벤치, 밤, 캔커피"
            ],
            "visual_inferences": [
              "fixed_element inwoo_bench_posture: twisting sharply on bench, gaze=looks_at_character",
              "fixed_element jihu_bench_posture: seated with chin raised, looking up",
              "Dim natural ambient lighting creates a blue-black palette for the night setting"
            ],
            "creative_decisions": [
              "Used close framing at eye level to isolate C03's side profile and intense gaze",
              "Rendered the woman as a soft, out-of-focus fragment on the opposite edge to maintain the framing scale rule and emphasize C03",
              "Emphasized the shared bench in the lower frame as a physical anchor between the foreground sharp figure and the background soft fragment"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "convenience store",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outdoor unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pavement",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trash can",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "72a4099f3b1f5661",
              "owned_hash": "57fda89002a08a35",
              "camera_direction_hash": "5b3413ec96415ca7",
              "owned_usage_hash": "dfa4cef496175255",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 6,
        "dependency_reason": "이전 샷의 벤치 대화 공간과 야간 분위기를 유지 (close framing으로 배경 자체는 생략됨)",
        "_shot_index": 4,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 6,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Continue laterally along the bench axis and settle at seated eye level beside 정인우, isolating his left-facing side profile as his expression hardens toward 김지후(강수리영). Keep 지후 as a soft three-quarter fragment at the opposite edge so his abruptly redirected eyeline remains physically explicit without altering the established axis.",
            "lighting_mood": "Natural ambient light appropriate to the nighttime exterior keeps 인우's arrested expression in low-key contrast while preserving the restrained blue-black palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L06B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "convenience_store_bench",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor bench situated in front of a convenience store at night. The surrounding area is dimly illuminated by natural, low-key ambient nighttime lighting, framed against a vast and dark night sky.",
                "applies_to_shots": [
                  3,
                  4,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 편의점 밖 - 밤",
                  "벤치에 나란히 앉은 두 사람",
                  "Natural ambient light appropriate to the nighttime exterior"
                ],
                "visual_inferences": [
                  "A standard outdoor wooden or metal bench, slightly illuminated by the indirect glow of the nearby convenience store."
                ],
                "creative_decisions": [
                  "Maintaining a heavy blue-black palette and low-key contrast to emphasize the darkness of the night sky above."
                ],
                "confidence": "high"
              },
              {
                "element_id": "jihu_bench_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young Korean woman seated on an outdoor bench. Her chin is noticeably tilted upward as she gazes high into the dark night sky. She holds an opened canned coffee low in her hand.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "한 손에 캔커피를 쥔 채 까만 밤하늘을 올려다보며",
                  "seated, chin tilted upward, gaze=up",
                  "opened canned coffee retained low in frame"
                ],
                "visual_inferences": [
                  "Her posture is relaxed but physically anchored to the bench, with the coffee can serving as a compact scale reference near her lap or lower torso."
                ],
                "creative_decisions": [
                  "The upward tilt of her head creates a distinct profile or three-quarter silhouette against the dark sky."
                ],
                "confidence": "high"
              },
              {
                "element_id": "inwoo_bench_posture",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A handsome young Korean man in his twenties seated on an outdoor bench. His upper body is pivoted on the seat, and his shoulders and head are turned sideways to lock his gaze entirely on the woman beside him.",
                "applies_to_shots": [
                  4,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "20대 남자가... 이 잘생긴 남자 이름은 정인우",
                  "twisting sharply on bench, gaze=looks_at_character",
                  "seated, shoulders drawn back, gaze=looks_at_character"
                ],
                "visual_inferences": [
                  "His lower body faces forward on the bench while his waist and neck twist to maintain a continuous, reactive focus on his companion."
                ],
                "creative_decisions": [
                  "Positioning his shoulders to frame the interaction space, emphasizing his intense focus."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 6,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C03O03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "4ddbf810b5ce5e79"
      },
      {
        "scene_index": 6,
        "heading": "실외. 편의점 밖 - 밤",
        "beat_title": "지후의 극단적인 방어적 태도와 쏘아보는 시선",
        "representative_moment": "C01이 미간을 찌푸린 채 매서운 눈빛으로 쏘아본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing at seated eye level, over-the-shoulder perspective with shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. Close framing at seated eye level. C01O01 in a casual jacket, a pale young Korean woman in her early 20s with long black hair, occupies most of the composition in three-quarter left profile, sharing the same outdoor bench. She leans slightly forward into the rebuke, her brow tightly knotted and her stare cutting sharply toward the figure opposite her. At the near right foreground edge, a soft out-of-focus sliver of a young Korean man's shoulder and upper back is visible, seated and facing her. Low-key ambient nighttime light emphasizes the tension in her eyes, maintaining restrained, earthy-neutral skin tones against the shadows. [: The background is heavily blurred, showing the dark night sky and a faint, dim glow from the convenience store exterior.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Shot description: 미간을 찌푸린 불쾌한 표정으로 쏘아보는 김지후의 얼굴",
              "Dialogue action: 극도의 방어적 태도와 분노 ('그럼 오빠하고도 끝이야!')",
              "Scene heading: 실외. 편의점 밖 - 밤"
            ],
            "visual_inferences": [
              "fixed_element inwoo_bench_posture: The counterpart's shoulder forms the foreground anchor (OTS) to prove the target of her glare",
              "fixed_element convenience_store_bench: The shared bench and dim ambient glow provide continuity from prior shots"
            ],
            "creative_decisions": [
              "Shallow depth of field to isolate C01's angry expression and knotting brow",
              "Earthy-neutral skin tones combined with low-key nighttime lighting to build heavy thriller tension"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "convenience store",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "outdoor unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pavement",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trash can",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5a2bc0b2f8ebb47d",
              "owned_hash": "57fda89002a08a35",
              "camera_direction_hash": "d1815e73c8090a9f",
              "owned_usage_hash": "dfa4cef496175255",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 6,
        "dependency_reason": "같은 씬 Shot 4의 야간 편의점 벤치 공간 연속성 및 정인우의 어깨 위치(OTS) 연계",
        "_shot_index": 7,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 6,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Finish the track near 정인우's side of the eyeline at seated eye level, closing tightly on 김지후(강수리영)'s three-quarter face as her brow knots and her stare cuts toward him. A soft sliver of 인우's shoulder may remain at the near edge to prove the target of her glare, while 지후's face occupies most of the composition without becoming a frontal portrait.",
            "lighting_mood": "Low-key ambient nighttime light emphasizes the tension in 지후's furrowed brow and eyes while maintaining restrained, earthy-neutral skin tones.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L06B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "convenience_store_bench",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor bench situated in front of a convenience store at night. The surrounding area is dimly illuminated by natural, low-key ambient nighttime lighting, framed against a vast and dark night sky.",
                "applies_to_shots": [
                  3,
                  4,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 편의점 밖 - 밤",
                  "벤치에 나란히 앉은 두 사람",
                  "Natural ambient light appropriate to the nighttime exterior"
                ],
                "visual_inferences": [
                  "A standard outdoor wooden or metal bench, slightly illuminated by the indirect glow of the nearby convenience store."
                ],
                "creative_decisions": [
                  "Maintaining a heavy blue-black palette and low-key contrast to emphasize the darkness of the night sky above."
                ],
                "confidence": "high"
              },
              {
                "element_id": "inwoo_bench_posture",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A handsome young Korean man in his twenties seated on an outdoor bench. His upper body is pivoted on the seat, and his shoulders and head are turned sideways to lock his gaze entirely on the woman beside him.",
                "applies_to_shots": [
                  4,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "20대 남자가... 이 잘생긴 남자 이름은 정인우",
                  "twisting sharply on bench, gaze=looks_at_character",
                  "seated, shoulders drawn back, gaze=looks_at_character"
                ],
                "visual_inferences": [
                  "His lower body faces forward on the bench while his waist and neck twist to maintain a continuous, reactive focus on his companion."
                ],
                "creative_decisions": [
                  "Positioning his shoulders to frame the interaction space, emphasizing his intense focus."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 6,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "a6242888c9f5d1b5"
      },
      {
        "scene_index": 7,
        "heading": "실외. 경찰서 주차장 - 낮 (인우의 회상)",
        "beat_title": "강압적 부탁과 대치",
        "representative_moment": "밝은 대낮의 주차장에서 C04O07과 C03O05가 마주 선 채 서로를 응시하는 와이드 앵글 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level balanced distance, restrained earthy neutrals with sober contrast",
            "t2i_prompt": "Photorealistic cinematic still. At eye level and a balanced distance, the two figures occupy the shared parking lot surface, their heads and shoulders in the upper frame and shoes resting in the lower frame. On the left, C04O07 in an elegant coat, a Korean middle-aged woman, stands in right profile, leaning forward with clasped hands, eyes fixed on C03O05. On the right, C03O05 in a casual jacket, a Korean young man, stands in left profile, weight shifting onto his back foot, eyes fixed on C04O07. Bright natural daylight casts a restrained earthy neutral color tone with sober contrast across the scene. [L08B01: an outdoor police station parking lot, bordered by a parked car and the station building, faint road marking visible on the ground.]",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O05"
              },
              {
                "character_id": "C04",
                "outlook_id": "O07"
              }
            ],
            "source_facts": [
              "실외. 경찰서 주차장 - 낮 (인우의 회상)",
              "인우가 지후 모, 강민숙(48)과 마주 서 있다.",
              "민숙은 마른 체구에 귀티나는 인상, 얼굴에 근심이 가득하다."
            ],
            "visual_inferences": [
              "restrained earthy neutrals with sober contrast (memory sequence)",
              "C04 leaning forward with clasped hands, C03 shifting weight away"
            ],
            "creative_decisions": [
              "Wide framing to capture the spatial distance and confrontation across the center, adhering to eye-level geometric constraints and sharing the ground anchor."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "building",
                "usage_kind": "anchor",
                "source_phrase": "the station building"
              },
              {
                "owned_token": "car",
                "usage_kind": "anchor",
                "source_phrase": "a parked car"
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "patrol car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "planter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "road marking",
                "usage_kind": "anchor",
                "source_phrase": "faint road marking visible on the ground"
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "08393b88cab82bb5",
              "owned_hash": "62a5bb5b4adf909d",
              "camera_direction_hash": "bd9b91d9b5be811c",
              "owned_usage_hash": "4da811ead096ce45",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "building",
                  "violating_phrase": "the station building",
                  "reason": "The station building is mentioned as a boundary to anchor the scene, which matches the producer's declaration as anchor and does not request any redrawing.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "car",
                  "violating_phrase": "a parked car",
                  "reason": "The parked car is referenced to define the spatial boundary of the parking lot, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "road marking",
                  "violating_phrase": "faint road marking visible on the ground",
                  "reason": "The faint road marking is referenced as an existing ground detail to establish the setting, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": -1,
        "dependency_reason": "No prior visual dependency; establishing memory sequence setting directly.",
        "_shot_index": 1,
        "visible_entities": [
          "C03",
          "C04",
          "L09"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level and a balanced wide distance, hold a static perpendicular two-person view with 강민숙(홍은미) on the left and 정인우 on the right, their opposing profiles defining the confrontation across the center. 민숙 leans subtly into the exchange while 인우's weight shifts away, allowing their unequal urgency to read through posture before the later push toward her face.",
            "lighting_mood": "Bright natural daylight, explicit to the recalled parking-lot scene, is graded into restrained earthy neutrals with sober contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "C04",
              "L09"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O05"
              },
              {
                "character_id": "C04",
                "outlook_id": "O07"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L08B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "bollard",
              "building",
              "car",
              "curb",
              "door",
              "drain",
              "patrol car",
              "planter",
              "road marking",
              "sign",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_station_parking_lot",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor police station parking lot under bright natural daylight. The environment maintains a restrained earthy neutral color tone with sober contrast, reflecting a memory sequence.",
                "applies_to_shots": [
                  1,
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 경찰서 주차장 - 낮",
                  "Bright natural daylight",
                  "restrained earthy neutrals with sober contrast"
                ],
                "visual_inferences": [
                  "The background shows typical asphalt parking lot textures, though heavily defocused in close-up shots."
                ],
                "creative_decisions": [
                  "Applying a restrained earthy neutral color grade visually distinguishes this memory sequence from the present day."
                ],
                "confidence": "high"
              },
              {
                "element_id": "kang_minsook_appearance",
                "element_type": "character_state",
                "character_name": "강민숙",
                "description": "A 48-year-old woman with a thin build and an elegant, wealthy impression. Her overall physical styling and demographic features remain consistent throughout the daylight scene.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "강민숙(48)",
                  "마른 체구에 귀티나는 인상"
                ],
                "visual_inferences": [
                  "She is dressed in high-quality, elegant clothing that reflects her wealthy background."
                ],
                "creative_decisions": [
                  "Her refined appearance is juxtaposed with the bleakness of the police parking lot and her internal desperation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "jung_inwoo_appearance",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A male police officer standing in the bright outdoor parking lot. His general attire and physical appearance remain consistent.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "정인우",
                  "경찰서 주차장"
                ],
                "visual_inferences": [
                  "He wears typical clothing for an off-duty or active detective in the mid-2020s, showing a slightly flustered demeanor."
                ],
                "creative_decisions": [
                  "His basic attire remains consistent, grounding his presence across the wide and over-the-shoulder framing."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C03O05",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O07",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L08B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "d0552b1efa5be960"
      },
      {
        "scene_index": 7,
        "heading": "실외. 경찰서 주차장 - 낮 (인우의 회상)",
        "beat_title": "돈봉투를 쥐여주는 강민숙",
        "representative_moment": "강민숙의 손이 두툼한 돈봉투를 정인우의 펼쳐진 손바닥 위에 강하게 억누르는 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "insert shot, hand height, perpendicular angle",
            "t2i_prompt": "Photorealistic cinematic still. In an isolated insert shot at hand height, the open palm of C03, an Asian man in his 20s, yields downward in left profile. The hand of an Asian woman in her 40s in right profile firmly presses P12, a thick money envelope, downward into his palm. The opposing hands and P12 occupy the center frame, effectively conveying the pressure. The broad face of P12 angles toward the camera, its thickness clearly visible along the compressed edge. Behind the hands, a narrow, heavily defocused trace of the outdoor police station parking lot's ground is visible. The scene is illuminated by bright natural daylight with restrained earthy neutral contrast, defining the memory sequence mood.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "S8 action: '대뜸 두툼한 돈봉투를 인우 손에 팍 쥐어준다.'",
              "shot description: 강민숙의 손이 두툼한 돈봉투를 당황한 정인우의 펼쳐진 손바닥 위에 강하게 억누르고 있어 정인우의 손바닥이 살짝 눌린 클로즈업 찰나.",
              "S8 env: 실외. 경찰서 주차장 - 낮",
              "S8 visual: Bright natural daylight, restrained earthy neutrals with sober contrast"
            ],
            "visual_inferences": [
              "fixed_element background: police_station_parking_lot showing defocused ground",
              "Close insert framing physically isolates the contact point between the hands and the envelope",
              "Opposing force conveyed by the woman's hand pressing down and the man's yielding palm"
            ],
            "creative_decisions": [
              "Utilized a perpendicular hand-height angle to emphasize the thick money envelope and the pressure applied by the woman's hand.",
              "Applied a restrained earthy neutral tone and bright daylight to maintain the memory sequence atmosphere and separate it from present day."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "building",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "patrol car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "planter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "road marking",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d12dd72d556acc7f",
              "owned_hash": "62a5bb5b4adf909d",
              "camera_direction_hash": "39ef2ea8faca5798",
              "owned_usage_hash": "794ca4e823247725",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": 7,
        "dependency_reason": "S7_Shot1 establishes the police station parking lot lighting and background for this flashback sequence.",
        "_shot_index": 6,
        "visible_entities": [
          "C03",
          "P12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At hand height and nearly perpendicular to 정인우's open palm, hold the closest point of the dolly as 강민숙(홍은미)'s hand drives the thick money envelope downward and visibly compresses his palm. Isolate the opposing hands and envelope at center while retaining only a narrow, defocused trace of the daytime parking area around the contact.",
            "lighting_mood": "Bright natural daylight renders the pressure in the hands and envelope clearly, with restrained neutral contrast appropriate to the memory.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "P12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [
              {
                "subject_id": "C03",
                "policy_type": "identity_reference",
                "policy": "base_id_required",
                "reason": "Only 정인우's open hand is visible in this isolated insert, making the base identity reference more appropriate than an outlook reference."
              }
            ],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L08B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "bollard",
              "building",
              "car",
              "curb",
              "door",
              "drain",
              "patrol car",
              "planter",
              "road marking",
              "sign",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_station_parking_lot",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor police station parking lot under bright natural daylight. The environment maintains a restrained earthy neutral color tone with sober contrast, reflecting a memory sequence.",
                "applies_to_shots": [
                  1,
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 경찰서 주차장 - 낮",
                  "Bright natural daylight",
                  "restrained earthy neutrals with sober contrast"
                ],
                "visual_inferences": [
                  "The background shows typical asphalt parking lot textures, though heavily defocused in close-up shots."
                ],
                "creative_decisions": [
                  "Applying a restrained earthy neutral color grade visually distinguishes this memory sequence from the present day."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character",
                "id": "C03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L08B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "5d825a42b37e4110"
      },
      {
        "scene_index": 7,
        "heading": "8. 실외. 경찰서 주차장 - 낮 (인우의 회상)",
        "beat_title": "멀어지는 민숙과 남겨진 인우",
        "representative_moment": "C03 stands in the foreground holding an envelope, watching the woman walk away in the parking lot.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide eye-level dolly-out composition, over-shoulder foreground, restrained earthy neutral color grade",
            "t2i_prompt": "Photorealistic cinematic still. C03O03 in a casual jacket, an Asian young man, stands in the middle-right foreground, looking toward a thin 48-year-old Asian woman walking away in the left background. Seen from behind at an over-shoulder angle, he is rooted in place with a thick envelope lowered in his hand. The woman, maintaining an elegant wealthy impression, is seen from behind mid-stride across the shared asphalt parking lot, shoulders sagging, gazing off-screen. Bright natural daylight washes over the environment, casting a restrained earthy neutral color tone with sober contrast. A distant building, a parked car, and white road markings anchor the wide spatial depth between the two separated figures.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "source_facts": [
              "실외. 경찰서 주차장 - 낮 (인우의 회상)",
              "어깨가 축 처진 채 주차장을 걷는 mid-stride 자세로 고정된 강민숙의 뒷모습",
              "그 자리에 우두커니 서서 그를 바라보는 정인우"
            ],
            "visual_inferences": [
              "fixed_element kang_minsook_appearance: thin build, elegant wealthy impression",
              "fixed_element police_station_parking_lot: restrained earthy neutral color tone, sober contrast"
            ],
            "creative_decisions": [
              "wide eye-level over-shoulder framing to emphasize the emotional and spatial distance between the two figures",
              "restrained earthy neutrals to visually distinguish the flashback memory sequence",
              "excluded the explicit L08 label tag as requested while maintaining the background elements"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "building",
                "usage_kind": "anchor",
                "source_phrase": "A distant building, a parked car, and white road markings anchor the wide spatial depth"
              },
              {
                "owned_token": "car",
                "usage_kind": "anchor",
                "source_phrase": "A distant building, a parked car, and white road markings anchor the wide spatial depth"
              },
              {
                "owned_token": "curb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "patrol car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "planter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "road marking",
                "usage_kind": "anchor",
                "source_phrase": "A distant building, a parked car, and white road markings anchor the wide spatial depth"
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0c5003acc6b4fedc",
              "owned_hash": "62a5bb5b4adf909d",
              "camera_direction_hash": "b63a9e828f6bc232",
              "owned_usage_hash": "effbd7a18e897689",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "building",
                  "violating_phrase": "A distant building",
                  "reason": "The building is mentioned solely to anchor the spatial depth between the figures, acting as an existing background reference as declared by the producer.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "car",
                  "violating_phrase": "a parked car",
                  "reason": "The parked car is referenced to establish spatial depth without any active instructions to redesign or recreate the background vehicle, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "road marking",
                  "violating_phrase": "white road markings",
                  "reason": "The white road markings are mentioned to anchor the depth of the scene, serving as a spatial reference rather than a new generation instruction, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": 7,
        "dependency_reason": "Shares the same outdoor police station parking lot location established in earlier shots of this scene.",
        "_shot_index": 8,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 7,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the dolly-out at eye level behind and slightly beside 정인우, placing his arrested over-shoulder figure in the right foreground while 강민숙(홍은미) recedes mid-stride toward the left background. Hold wide once the depth between them becomes unmistakable, using their separation along the parking-lot path as the final emotional image of the memory.",
            "lighting_mood": "Bright natural daylight holds both separated figures legibly while a restrained neutral grade preserves the memory's tragic weight.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "강민숙 walking away",
                  "label": "정인우",
                  "screen_zone": "middle_right",
                  "target_id": "C03",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O03"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L08B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "bollard",
              "building",
              "car",
              "curb",
              "door",
              "drain",
              "patrol car",
              "planter",
              "road marking",
              "sign",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_station_parking_lot",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor police station parking lot under bright natural daylight. The environment maintains a restrained earthy neutral color tone with sober contrast, reflecting a memory sequence.",
                "applies_to_shots": [
                  1,
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 경찰서 주차장 - 낮",
                  "Bright natural daylight",
                  "restrained earthy neutrals with sober contrast"
                ],
                "visual_inferences": [
                  "The background shows typical asphalt parking lot textures, though heavily defocused in close-up shots."
                ],
                "creative_decisions": [
                  "Applying a restrained earthy neutral color grade visually distinguishes this memory sequence from the present day."
                ],
                "confidence": "high"
              },
              {
                "element_id": "kang_minsook_appearance",
                "element_type": "character_state",
                "character_name": "강민숙",
                "description": "A 48-year-old woman with a thin build and an elegant, wealthy impression. Her overall physical styling and demographic features remain consistent throughout the daylight scene.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "강민숙(48)",
                  "마른 체구에 귀티나는 인상"
                ],
                "visual_inferences": [
                  "She is dressed in high-quality, elegant clothing that reflects her wealthy background."
                ],
                "creative_decisions": [
                  "Her refined appearance is juxtaposed with the bleakness of the police parking lot and her internal desperation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "jung_inwoo_appearance",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A male police officer standing in the bright outdoor parking lot. His general attire and physical appearance remain consistent.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "정인우",
                  "경찰서 주차장"
                ],
                "visual_inferences": [
                  "He wears typical clothing for an off-duty or active detective in the mid-2020s, showing a slightly flustered demeanor."
                ],
                "creative_decisions": [
                  "His basic attire remains consistent, grounding his presence across the wide and over-the-shoulder framing."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C03O03",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L08B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "eeaff7878297f594"
      },
      {
        "scene_index": 8,
        "heading": "9. 다시 편의점 밖 - 밤",
        "beat_title": "돈봉투를 빼앗으며 폭발하는 지후",
        "representative_moment": "C01이 벤치에 앉아 C03의 손에 들린 P12를 강하게 움켜쥐고 당긴다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "From seated-torso height, medium framing focused on the opposing pull of the envelope, restrained blue-black and earthy neutral low-key lighting.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a worker uniform, a young pale Korean early-20s woman with long straight black hair, sits in the middle-left midground reaching for the contested money envelope, and C03O05 in neat casual clothes, a Korean mid-20s man with short black hair, sits in the middle-right midground reaching for the contested money envelope. Viewed from seated-torso height, both seated torsos occupy the frame. C01O01 is positioned at three-quarter angle from the right, lunging forward from the shared wooden bench, looking down at the envelope. Opposite her, C03O05 is positioned at three-quarter angle from the left, bracing his elbow against the pull, also looking down. The P12 thick money envelope occupies the lower center, held taut between their opposing gripping hands. The blurred wooden bench in the dark background is visible below them, and the storefront of the convenience store stands faintly behind the bench. A low-key, high-contrast night environment envelops the scene, with ambient lighting consisting of restrained blue-black and earthy neutral values, maintaining a moody atmosphere without any explicitly visible light sources.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "Shot description: 김지후가 정인우의 손에 쥐어진 두툼한 돈봉투의 끝을 강하게 움켜쥐고 자기 쪽으로 팽팽하게 끌어당기는 mid-action 순간.",
              "C01 angle: three_quarter_right, lunging forward from bench, gaze=down",
              "C03 angle: three_quarter_left, bracing elbow against pull, gaze=down",
              "Camera direction: From seated-torso height about two meters in front of the bench, holding both seated torsos while the contested envelope occupies the lower center."
            ],
            "visual_inferences": [
              "fixed_element night_lighting_environment: A low-key, high-contrast night environment, restrained blue-black and earthy neutral values without assigning an unsupported visible light source.",
              "The P12 thick money envelope is held taut between their hands to convey the physical tension of pulling."
            ],
            "creative_decisions": [
              "Placed the camera strictly at seated-torso height to ensure both torsos and the contested envelope in the lower center are geometrically consistent within a medium framing.",
              "Preserved the specific phrasing 'the blurred wooden bench in the dark background' to satisfy the forward zoom target continuity for the upcoming close-up shot."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "anchor",
                "source_phrase": "shared wooden bench"
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "convenience store",
                "usage_kind": "anchor",
                "source_phrase": "convenience store"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "envelope",
                "usage_kind": "anchor",
                "source_phrase": "contested money envelope"
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trash can",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "fa73639920b77640",
              "owned_hash": "a7da39790371055e",
              "camera_direction_hash": "a625bd0f63839e31",
              "owned_usage_hash": "ca4060e2b4bdfec4",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bench",
                  "violating_phrase": "shared wooden bench",
                  "reason": "The bench is mentioned only as a physical anchor for the characters' seating positions, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "convenience store",
                  "violating_phrase": "storefront of the convenience store stands faintly behind",
                  "reason": "The convenience store is referenced solely as a faint background visual anchor with no instructions to alter it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "envelope",
                  "violating_phrase": "P12 thick money envelope occupies the lower center, held taut between their opposing gripping hands",
                  "reason": "The envelope is actively held and pulled between the characters' gripping hands, which describes the physical interaction geometry allowed under the prop contact exception.",
                  "verdict": "allowed_prop_contact"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "C03",
          "L08",
          "P12"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "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 seated-torso height about two meters in front of the bench, angle toward the gap between 김지후(강수리영) on frame left and 정인우 on frame right, holding both seated torsos while the contested envelope occupies the lower center. Begin the prescribed dolly-in with the lower framing tightened around 김지후(강수리영)'s gripping hand, retaining 정인우's hand and the opposing tension without letting the envelope exceed a third of the image.",
            "lighting_mood": "Low-key, high-contrast night rendering uses restrained blue-black and earthy neutral values without assigning an unsupported visible light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "reaches_for",
                  "gesture_target_label": "contested money envelope",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_left",
                  "target_id": "C01",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "reaches_for",
                  "gesture_target_label": "contested money envelope",
                  "label": "정인우",
                  "screen_zone": "middle_right",
                  "target_id": "C03",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "L08",
              "P12"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L09B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV",
              "awning",
              "bench",
              "bollard",
              "convenience store",
              "door",
              "envelope",
              "refrigerator",
              "shelf",
              "sign",
              "trash can",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_lighting_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A low-key, high-contrast night environment surrounding the bench area. The ambient lighting consists of restrained blue-black and earthy neutral values, maintaining a dark, moody atmosphere without any explicitly visible or unsupported light sources.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key, high-contrast night rendering uses restrained blue-black and earthy neutral values without assigning an unsupported visible light source",
                  "Low-key night contrast holds her newly pale, frozen expression against restrained blue-black and neutral surroundings without specifying an unsupported source",
                  "soft trace of the bench-side setting at the edges"
                ],
                "visual_inferences": [
                  "The overall environment remains heavily shadowed, providing a cold and isolating nocturnal backdrop for the interaction."
                ],
                "creative_decisions": [
                  "Relying entirely on atmospheric night contrast to emphasize the dramatic tension rather than using distinct practical street lights."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [
              {
                "scene_index": 8,
                "shot_index": 5,
                "description": "기묘한 기시감과 설명할 수 없는 서늘함에 사로잡혀 창백하게 굳어버린 김지후(강수리영)의 얼굴 클로즈업.",
                "keep_elements": [
                  {
                    "label": "the blurred wooden bench in the dark background",
                    "kind": "environment",
                    "subject_kind": "non_human_visual_element"
                  }
                ]
              }
            ],
            "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L09B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7eea95d0c9efa713"
      },
      {
        "scene_index": 8,
        "heading": "다시 편의점 밖 - 밤",
        "beat_title": "기시감에 사로잡힌 굳은 얼굴",
        "representative_moment": "지후가 스물세 번째 생일이라는 말에 기시감을 느끼고 창백하게 굳은 얼굴로 렌즈 밖을 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight facial close-up at eye level, low-key night contrast",
            "t2i_prompt": "Photorealistic cinematic still. A tight facial close-up of the same young Asian woman in her 20s wearing a blue vest, her face occupying most of the frame. She is facing the camera, shoulders locked mid-breath, with her eyes fixed off-screen just beside the lens. Her newly pale expression is frozen in uncanny recognition. The low-key, high-contrast night environment illuminates her features with restrained blue-black and earthy neutral values, maintaining a dark, moody atmosphere without an explicitly visible light source. Only a soft, out-of-focus trace of the same bench line remains behind her shoulders at the background edge.",
            "outfit_assignments": [],
            "source_facts": [
              "S8 action: '그러고 보니… 이상한 기시감에 얼굴이 굳는 지후.'",
              "shot description: At Jihu's eye level and directly along her eyeline, tight facial close-up, Jihu facing camera, gaze off-screen, shoulders locked mid-breath"
            ],
            "visual_inferences": [
              "fixed_element night_lighting_environment: A low-key, high-contrast night environment using restrained blue-black and earthy neutral values",
              "zoom_in_detail requires preserving the same space and lighting from the prior shot, focusing strictly on the subject's face"
            ],
            "creative_decisions": [
              "tight facial close-up to isolate the sudden shift in emotion",
              "leaving only a soft trace of the bench at the edges to maintain spatial context without distracting from the frozen expression"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerator",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sign",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storefront",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trash can",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ed52673dad268450",
              "owned_hash": "5881785e2bcada54",
              "camera_direction_hash": "3157b3a8393181bf",
              "owned_usage_hash": "865bc936cd663705",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 8,
        "dependency_reason": "S8_Shot1과 동일한 시간/공간(편의점 앞 벤치의 야간 조명) 연속성을 유지하며 인물의 얼굴만 타이트하게 클로즈업",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 8,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 김지후(강수리영)'s eye level and directly along her eyeline, complete the dolly-in at an especially tight facial close-up, with her face occupying most of the frame and only a soft trace of the bench-side setting at the edges. The emphasized change is camera distance alone: surprise drains into a rigid, uncanny recognition while her gaze holds just beside the lens toward 정인우.",
            "lighting_mood": "Low-key night contrast holds her newly pale, frozen expression against restrained blue-black and neutral surroundings without specifying an unsupported source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L09B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_lighting_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A low-key, high-contrast night environment surrounding the bench area. The ambient lighting consists of restrained blue-black and earthy neutral values, maintaining a dark, moody atmosphere without any explicitly visible or unsupported light sources.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key, high-contrast night rendering uses restrained blue-black and earthy neutral values without assigning an unsupported visible light source",
                  "Low-key night contrast holds her newly pale, frozen expression against restrained blue-black and neutral surroundings without specifying an unsupported source",
                  "soft trace of the bench-side setting at the edges"
                ],
                "visual_inferences": [
                  "The overall environment remains heavily shadowed, providing a cold and isolating nocturnal backdrop for the interaction."
                ],
                "creative_decisions": [
                  "Relying entirely on atmospheric night contrast to emphasize the dramatic tension rather than using distinct practical street lights."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 8,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "3d3b3b7adba77ccd"
      },
      {
        "scene_index": 9,
        "heading": "실내. 민숙 집(다세대 주택) - 밤",
        "beat_title": "소파의 여인을 발견하고 얼어붙은 민숙",
        "representative_moment": "A Korean middle-aged woman freezes in terror near the doorway edge, her pale face staring off-screen.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close framing with low-key, high-contrast night lighting isolating the subject's pale face.",
            "t2i_prompt": "Photorealistic cinematic still. Shot at eye level in close framing. A Korean middle-aged woman in a casual jacket occupies the frame, positioned slightly off-center at a three-quarter angle from the left. Her shoulders are drawn tight, her face strikingly pale and frozen in sheer terror with gathering tears visible. Her wide eyes remain fixed off-screen. Beside her, [: the hard vertical edge of a narrow doorway compresses one side of the composition, the immediate apartment entrance heavily shadowed]. Low-key, high-contrast night interior lighting isolates her pallor and wet eyes against the claustrophobic, pitch-black threshold, obscuring any deeper background details.",
            "outfit_assignments": [],
            "source_facts": [
              "단촐한 크기의 투 룸 다세대 주택 거실",
              "소파에 앉은 누군가를 보고 허걱- 얼어붙는다. 금새 하얗게 질리는 얼굴.",
              "눈에는 두려움에 눈물이 고인다.",
              "living-room side of the doorway"
            ],
            "visual_inferences": [
              "fixed_element modest_living_room_entrance: cramped and claustrophobic atmosphere around the threshold",
              "Low-key, high-contrast night interior treatment isolates her pallor",
              "The doorway edge acts as a geometric boundary compressing the framing"
            ],
            "creative_decisions": [
              "Close framing completely isolates the subject's face from the background to heighten claustrophobia",
              "Using a three-quarter left profile to emphasize her off-screen stare while maintaining a connection to the doorway edge"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "digital door lock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "intercom",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light switch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slipper",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "umbrella stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "468eb3bb1a808c84",
              "owned_hash": "7e864b3e4f90a5ae",
              "camera_direction_hash": "97e59fdd7e1ae588",
              "owned_usage_hash": "cd037ba0c4f536ee",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 7,
        "dependency_reason": "Location reference from previous shot S7_Shot8, but close framing intentionally skips exact background matching to focus solely on the subject's immediate edge.",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 9,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the living-room side of the doorway at 강민숙(홍은미)'s eye level, finish the dolly-in at close range with her face slightly off-center and the doorway edge compressing one side of the frame. The emphasized shift is distance: her trembling stare remains aimed toward the unseen sofa as her face loses color and her breath catches.",
            "lighting_mood": "Low-key, high-contrast night interior treatment isolates her pallor and gathering tears without inventing a particular lamp or color source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L08B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "modest_living_room_entrance",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The narrow entrance and doorway area of a small, modest two-room apartment. The space is heavily shadowed by a low-key, high-contrast night lighting setup, creating a cramped and claustrophobic atmosphere around the threshold.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "단촐한 크기의 투 룸 다세대 주택 거실",
                  "Low-key, high-contrast night interior treatment",
                  "Low-key night interior contrast",
                  "living-room side of the doorway",
                  "open entrance in a wide composition"
                ],
                "visual_inferences": [
                  "The small size of the apartment makes the entrance area feel highly restrictive, leaving little room to maneuver."
                ],
                "creative_decisions": [
                  "Utilizing deep shadows and high contrast to obscure background details and emphasize the feeling of a spatial trap at the doorway."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 7,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "4e337c7dc13ed3e8"
      },
      {
        "scene_index": 9,
        "heading": "실내. 민숙 집(다세대 주택) - 밤",
        "beat_title": "퇴로를 막아선 거대한 그림자",
        "representative_moment": "도망치려던 강민숙이 현관을 꽉 막고 선 거대한 고산들을 보고 경악하며 뒤로 넘어질 듯 멈춰선다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Wide dolly-out at chest height with low-key high-contrast night lighting",
            "t2i_prompt": "Photorealistic cinematic still. C04O07 in a dark coat, an Asian woman in her 40s, recoils with knees buckling in the lower-center foreground, looking toward the large man blocking the entrance, while C08O13 in dark workwear, an Asian man in his 40s, stands in the upper-center background, blocking the open entrance doorway. Viewed from chest height inside the modest living room, the camera captures the shared space of the narrow threshold. With her back to the camera, C04O07 arches backward, her neat black hair visible from behind. Across the doorway from her, C08O13 faces the camera with an imposing stance. His massive torso fills the entrance space, but his head extends beyond the upper frame edge, leaving his face completely excluded and unreadable, though his unseen eyes are fixed down on her. Deep shadows from the low-key night lighting setup envelop the cramped interior, highlighting the edge of the open door and the digital door lock, turning the small apartment entrance into a claustrophobic trap.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O07"
              },
              {
                "character_id": "C08",
                "outlook_id": "O13"
              }
            ],
            "source_facts": [
              "민숙이 휙 뒤돌아 현관문을 열고 도망가려 하다가 뒤로 넘어질 듯 멈춰선다.",
              "산처럼 큰 덩치의 남자가 떡 하니 현관문을 막고 서 있었던 것.",
              "단촐한 크기의 투 룸 다세대 주택 거실"
            ],
            "visual_inferences": [
              "The narrow entrance and doorway area is heavily shadowed by a low-key, high-contrast night lighting setup.",
              "C08's face is excluded above the frame to emphasize his massive size and unreadable, threatening presence.",
              "The spatial relationship highlights the doorway as a trap, cutting off the escape route."
            ],
            "creative_decisions": [
              "Placed C04 in the lower-center foreground to emphasize her collapsed, recoiling state beneath the towering figure.",
              "Chest-height wide composition with explicit shared spatial anchor (the narrow threshold) to tie the foreground and background interactions seamlessly.",
              "Highlighting the edge of the open door and digital door lock to ground the location context and anchor the exact background reference."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002",
              "fsc_003"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "curtain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "digital door lock",
                "usage_kind": "anchor",
                "source_phrase": "the digital door lock"
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "edge of the open door"
              },
              {
                "owned_token": "intercom",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light switch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slipper",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "umbrella stand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "488c8d7f78d01ed5",
              "owned_hash": "7e864b3e4f90a5ae",
              "camera_direction_hash": "e2bc49d0abfecb3e",
              "owned_usage_hash": "ce79aa913f090463",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "digital door lock",
                  "violating_phrase": "the digital door lock",
                  "reason": "The digital door lock is only referenced to describe lighting effects, acting as an anchor rather than being redrawn, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "edge of the open door",
                  "reason": "The door is mentioned to establish the spatial composition and lighting highlights, acting as an anchor rather than being redrawn, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 9,
        "dependency_reason": "exact_background from prior shot S9_Shot3 (same room, different moment)",
        "_shot_index": 6,
        "visible_entities": [
          "C04",
          "C08",
          "L10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 9,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height about three meters inside the living room, center the open entrance in a wide composition as 강민숙(홍은미) recoils through the lower middle and 고산들 blocks the background opening. End the dolly-out with his torso fully readable but his face excluded above the frame, making the doorway and the backward arch of her body the single spatial trap.",
            "lighting_mood": "Low-key night interior contrast separates the recoiling figure from the doorway obstruction while leaving 고산들's unseen face unreadable.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "open entrance doorway",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "large man blocking the entrance",
                  "label": "강민숙(홍은미)",
                  "screen_zone": "lower_center",
                  "target_id": "C04",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_003",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "고산들",
                  "screen_zone": "upper_center",
                  "target_id": "C08",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "C08",
              "L10"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C04",
                "outlook_id": "O07"
              },
              {
                "character_id": "C08",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L08B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "ceiling light",
              "curtain",
              "digital door lock",
              "door",
              "intercom",
              "light switch",
              "shoe cabinet",
              "slipper",
              "sofa",
              "umbrella stand",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "modest_living_room_entrance",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The narrow entrance and doorway area of a small, modest two-room apartment. The space is heavily shadowed by a low-key, high-contrast night lighting setup, creating a cramped and claustrophobic atmosphere around the threshold.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "단촐한 크기의 투 룸 다세대 주택 거실",
                  "Low-key, high-contrast night interior treatment",
                  "Low-key night interior contrast",
                  "living-room side of the doorway",
                  "open entrance in a wide composition"
                ],
                "visual_inferences": [
                  "The small size of the apartment makes the entrance area feel highly restrictive, leaving little room to maneuver."
                ],
                "creative_decisions": [
                  "Utilizing deep shadows and high contrast to obscure background details and emphasize the feeling of a spatial trap at the doorway."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 9,
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C04O07",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C08O13",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L08B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "1cfa68f81ea2ee93"
      },
      {
        "scene_index": 10,
        "heading": "실내. 편의점 - 같은 시각",
        "beat_title": "도망쳐",
        "representative_moment": "An insert of a smartphone screen displaying '도망쳐', held tightly by a woman's hands over the shadowed counter.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Insert framing from slightly above, focusing on the illuminated phone screen against a dark background",
            "t2i_prompt": "Photorealistic cinematic still. An insert framing focused on a smartphone gripped in both hands by an Asian young woman positioned at a three-quarter angle from the right. Only her hands and the lower portion of her forearms enter the frame. The camera is positioned directly in front of the hands and slightly above the device. The active front display of the smartphone faces the camera squarely, occupying the central third of the composition. The brightly lit screen clearly displays the short text '도망쳐'. Her fingers wrap tightly around the edges of the phone, providing a scale reference against a narrow strip of the checkout counter visible directly beneath. A partial edge of an envelope rests on the counter near her hands. The surrounding convenience store interior is enveloped in subdued, low-key night illumination with high contrast. The background spaces are submerged in deep, dark shadows, allowing the explicitly active phone display to provide a intense, readable local brightness that casts a crisp glow across her gripping fingers.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot description: 핸드폰 화면에 '도망쳐'라는 짧은 메시지가 선명하게 뜬 찰나.",
              "DP notes: Directly in front of hands and slightly above the phone... lit display occupying roughly the central third.",
              "DP notes: phone gripped in both hands, gaze=down."
            ],
            "visual_inferences": [
              "fixed_element: The checkout counter area inside the convenience store is enveloped in subdued, low-key night illumination with high contrast.",
              "The character is positioned at a three-quarter angle from the right based on staging, though only her hands are fully visible in the insert frame."
            ],
            "creative_decisions": [
              "Adopted an insert framing scale to isolate the hands, the smartphone, and a sliver of the counter, completely blurring or removing the background to heighten tension.",
              "Used the phone screen as the primary local light source to cast a high-contrast glow on the character's fingers."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "POS terminal",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "anchor",
                "source_phrase": "a narrow strip of the checkout counter visible directly beneath"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "envelope",
                "usage_kind": "anchor",
                "source_phrase": "A partial edge of an envelope rests on the counter near her hands."
              },
              {
                "owned_token": "gondola shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerated display case",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "redraw",
                "source_phrase": "a smartphone gripped in both hands by an Asian young woman"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "22bfe051de3bf27c",
              "owned_hash": "5489f4a6f2f876f6",
              "camera_direction_hash": "d746f8d3667acc03",
              "owned_usage_hash": "73733457fca304c1",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "counter",
                  "violating_phrase": "a narrow strip of the checkout counter visible directly beneath",
                  "reason": "The counter is mentioned only as a spatial reference beneath the hands, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "envelope",
                  "violating_phrase": "A partial edge of an envelope rests on the counter near her hands",
                  "reason": "The envelope is referenced as an existing item on the counter to establish composition detail, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "a smartphone gripped in both hands... screen clearly displays the short text '도망쳐'",
                  "reason": "The modification of the smartphone screen's depicted content to display '도망쳐' is explicitly and structurally required by the shot_intent, qualifying it as an allowed visual state change.",
                  "verdict": "allowed_visual_state_change"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 10,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Directly in front of 김지후(강수리영)'s hands and slightly above the phone, finish the dolly-in with the lit display occupying roughly the central third rather than overwhelming the frame; her fingers and a narrow strip of counter remain as scale references. Keep the phone's front face square enough for the short message “도망쳐” to read clearly, setting up the upward tilt toward her face.",
            "lighting_mood": "Low-key convenience-store interior illumination at night keeps the surroundings subdued while the explicitly active phone display provides readable local brightness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L10B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "POS terminal",
              "ceiling light",
              "counter",
              "door",
              "envelope",
              "gondola shelf",
              "refrigerated display case",
              "smartphone",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "convenience_store_counter_area",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The checkout counter area inside the convenience store is enveloped in subdued, low-key night illumination with high contrast. The counter acts as a persistent structural anchor in the scene, surrounded by dark, shadowy spaces that heighten the tense atmosphere.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key convenience-store interior illumination at night keeps the surroundings subdued",
                  "a narrow strip of counter remain as scale references",
                  "Hold beside the counter",
                  "Low-key, high-contrast store illumination preserves the entrance as a dark visual pull"
                ],
                "visual_inferences": [
                  "The surrounding interior of the store remains heavily shadowed to isolate the area around the counter where the character is standing."
                ],
                "creative_decisions": [
                  "Maintain the high-contrast lighting across both shots to ensure the brightly lit phone screen and the character's anxious profile stand out against the dark 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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L10B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "236ab15c42048fa4"
      },
      {
        "scene_index": 10,
        "heading": "11. 실내. 편의점 - 같은 시각",
        "beat_title": "응답 없는 전화와 고조되는 불안",
        "representative_moment": "Anxious and frozen, she presses the phone to her ear, staring blankly toward the dark entrance.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium shot from beside the counter, high-contrast low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. The dark convenience-store entrance occupies the middle-right background. An East Asian young woman stands in the left half of the frame in right profile, a smartphone pressed tight to her ear, looking off-screen toward the entrance with an anxious expression. The counter forms a lateral base line beneath her profile in the lower frame. Subdued, low-key night illumination with high contrast isolates the checkout counter area, highlighting her face against the deep, shadowy surroundings.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: right-facing profile, holding the phone tight to her ear, looking toward the dark entrance",
              "action: placing a call and waiting anxiously, gazing off-screen"
            ],
            "visual_inferences": [
              "fixed_element: The checkout counter area is enveloped in subdued, low-key night illumination with high contrast",
              "The counter acts as a persistent structural anchor below her profile"
            ],
            "creative_decisions": [
              "Frame the character on the left half to leave the right side open, emphasizing the visual pull of the dark entrance",
              "Maintain high contrast to make her anxious expression legible against the dark background"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "POS terminal",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "anchor",
                "source_phrase": "The counter forms a lateral base line beneath her profile"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "envelope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gondola shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "refrigerated display case",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "redraw",
                "source_phrase": "a smartphone pressed tight to her ear"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a71b62e9ef644791",
              "owned_hash": "5489f4a6f2f876f6",
              "camera_direction_hash": "d96ba1ef2294af73",
              "owned_usage_hash": "72d56fc2c12b6232",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "counter",
                  "violating_phrase": "The counter forms a lateral base line beneath her profile",
                  "reason": "The counter is mentioned only as a compositional base line and spatial anchor, matching the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "a smartphone pressed tight to her ear",
                  "reason": "The prompt specifies a character holding the smartphone against her ear, focusing entirely on the physical interaction geometry without redesigning its appearance, qualifying for the prop contact exception.",
                  "verdict": "allowed_prop_contact"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 10,
        "dependency_reason": "exact_background of the convenience store interior from the previous shot",
        "_shot_index": 5,
        "visible_entities": [],
        "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": "Hold beside the counter at 김지후(강수리영)'s eye height, perpendicular to her eyeline, after the lateral track resolves into a tense right-facing profile. Frame her in the left half with the phone tight to her ear and leave the dark entrance direction open across the right side, emphasizing her diverted gaze rather than changing the settled distance.",
            "lighting_mood": "Low-key, high-contrast store illumination preserves the entrance as a dark visual pull while keeping her anxious profile legible.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "dark convenience-store entrance",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L10B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "POS terminal",
              "ceiling light",
              "counter",
              "door",
              "envelope",
              "gondola shelf",
              "refrigerated display case",
              "smartphone",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "convenience_store_counter_area",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The checkout counter area inside the convenience store is enveloped in subdued, low-key night illumination with high contrast. The counter acts as a persistent structural anchor in the scene, surrounded by dark, shadowy spaces that heighten the tense atmosphere.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key convenience-store interior illumination at night keeps the surroundings subdued",
                  "a narrow strip of counter remain as scale references",
                  "Hold beside the counter",
                  "Low-key, high-contrast store illumination preserves the entrance as a dark visual pull"
                ],
                "visual_inferences": [
                  "The surrounding interior of the store remains heavily shadowed to isolate the area around the counter where the character is standing."
                ],
                "creative_decisions": [
                  "Maintain the high-contrast lighting across both shots to ensure the brightly lit phone screen and the character's anxious profile stand out against the dark background."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 10,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L10B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "9ce332e5479bef22"
      },
      {
        "scene_index": 11,
        "heading": "실외. 다세대 주택가 골목 - 밤",
        "beat_title": "지후 앞을 가로막는 인우의 경찰차",
        "representative_moment": "C01 halts mid-stride as a police car abruptly brakes in front of her in the dark alleyway.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height wide lateral shot, low-key blue-black contrast with harsh localized red lighting",
            "t2i_prompt": "Photorealistic cinematic still. Shot from chest height lateral to the stopping point, capturing a wide low-key blue-black night environment. C01O01 in a dark casual jacket, a Korean young woman with a pretty oval face, long straight black hair, and a pale youthful expression, is compressed against the left frame edge in three-quarter left angle, halting mid-stride breathless and looking off-screen. Centered in the composition, the police car angles its front and near side toward the camera, its metallic body pitching slightly forward under abrupt braking, occupying a lower portion of the frame. An actively illuminated red lightbar on the car roof casts a distinct localized red warning glow over the vehicle's exterior edges and the adjacent pavement. The shadowy structures of the apartment building and walls recede in the background, contrasting heavily with the piercing red light. The camera focuses on the sudden spatial tension between the abruptly braking vehicle and the breathless figure.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "지붕에는 붉은 경광등",
              "붉은 경광등이 켜진 경찰차가 앞 골목길에 급정거하여",
              "실외. 다세대 주택가 골목 - 밤"
            ],
            "visual_inferences": [
              "The vehicle's chassis pitches forward under the sudden braking force.",
              "The red beacon acts as a localized practical light source cutting through the blue-black darkness.",
              "C01's mid-stride halt emphasizes the abruptness of the vehicle's arrival."
            ],
            "creative_decisions": [
              "Compress C01 against the left frame edge to emphasize the intruding mass of the police car.",
              "Use a lateral chest-height angle to capture both the vehicle's dynamic stop and the character's reaction in the same spatial plane."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "air conditioner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "apartment building",
                "usage_kind": "anchor",
                "source_phrase": "shadowy structures of the apartment building"
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lightbar",
                "usage_kind": "anchor",
                "source_phrase": "illuminated red lightbar on the car roof"
              },
              {
                "owned_token": "parked car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pavement",
                "usage_kind": "anchor",
                "source_phrase": "the adjacent pavement"
              },
              {
                "owned_token": "police car",
                "usage_kind": "anchor",
                "source_phrase": "the police car angles its front and near side toward the camera"
              },
              {
                "owned_token": "scooter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trash bag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "apartment building and walls recede"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "567a24794e8d838b",
              "owned_hash": "ba52766b12d4cedb",
              "camera_direction_hash": "adcdac6596b0a245",
              "owned_usage_hash": "9b3429e64e883600",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "apartment building",
                  "violating_phrase": "shadowy structures of the apartment building",
                  "reason": "The apartment building is referenced as a background structural element to establish the environment, matching the producer's anchor echo with no redraw intent.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "walls recede in the background",
                  "reason": "The walls are mentioned as background structures to anchor the composition, which is a valid anchor reference with no redraw intent.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "police car",
                  "violating_phrase": "the police car angles its front and near side toward the camera, its metallic body pitching slightly forward",
                  "reason": "The police car is positioned and its physical posture under braking is described to establish spatial tension, representing a valid anchor reference with no redesign of the vehicle.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "lightbar",
                  "violating_phrase": "actively illuminated red lightbar on the car roof",
                  "reason": "The lightbar's illuminated state is described to define the environmental lighting, acting as a valid anchor reference with no intention to recreate the object.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pavement",
                  "violating_phrase": "the adjacent pavement",
                  "reason": "The pavement is referenced purely as a surface receiving the lightbar's glow, serving as a spatial anchor with no redraw intent.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height about three meters lateral to the stopping point, complete the pan with the police car's front and near side centered while 김지후(강수리영) remains compressed against one frame edge. Catch the instant the body pitches slightly forward under braking, keeping the vehicle below forty percent of the frame and preserving the surrounding alley as scale context.",
            "lighting_mood": "Low-key blue-black night contrast is punctured by the explicitly illuminated red police beacon, with no additional weather or light source specified.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L07B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "air conditioner",
              "apartment building",
              "bollard",
              "door",
              "drain",
              "gate",
              "lightbar",
              "parked car",
              "pavement",
              "police car",
              "scooter",
              "streetlight",
              "trash bag",
              "utility pole",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_car_beacon",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A police car is situated in the alleyway. A red warning beacon on its roof is actively illuminated, casting a distinct red glow over the exterior edges of the vehicle and the immediate surrounding space.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "지붕에는 붉은 경광등",
                  "붉은 경광등이 켜진 경찰차가 앞 골목길에 급정거하여",
                  "explicitly illuminated red police beacon",
                  "supported red beacon accent along the car edge"
                ],
                "visual_inferences": [
                  "After the abrupt stop, the vehicle remains stationary in the alleyway while the characters interact.",
                  "The red beacon acts as a localized practical light source on the car's metallic surface."
                ],
                "creative_decisions": [
                  "Use the red beacon to create a sense of urgency and visually anchor the police vehicle in the dark frame."
                ],
                "confidence": "high"
              },
              {
                "element_id": "night_alleyway_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A narrow alleyway in a residential neighborhood at night. The overall environment features a low-key, blue-black darkness, providing a cold and shadowy backdrop that heavily contrasts with the localized red light from the car.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 다세대 주택가 골목 - 밤",
                  "surrounding alley as scale context",
                  "Low-key blue-black night contrast",
                  "Low-key night contrast"
                ],
                "visual_inferences": [
                  "The structures of the multi-family houses forming the alley are largely obscured by shadows, leaving only the immediate street-level area visible."
                ],
                "creative_decisions": [
                  "Maintain a cold blue-black atmospheric tone to heighten the tension of the scene and emphasize the isolated feel of the night street."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L07B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "188ce0f06955c2fa"
      },
      {
        "scene_index": 11,
        "heading": "12. 실외. 다세대 주택가 골목 - 밤",
        "beat_title": "급정거와 인우의 하차",
        "representative_moment": "정인우(C03)가 붉은 경광등을 켠 채 경찰차를 급정거한 후, 운전석 문을 열고 다급히 상체를 내미는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium view outside the open driver's door, low-key night contrast",
            "t2i_prompt": "Photorealistic cinematic still. Medium view at eye level outside the open door of the police car. The door acts as a diagonal foreground boundary, its inner face angled toward the camera. C03O05 in a neat casual jacket, an Asian man in his 20s, leaning his upper body through the opening at three-quarter angle from the right, eyes fixed on a figure off-screen, his face tense and hardened. The dark driver's seat provides a recessed space behind his torso. Low-key blue-black night darkness envelops the surroundings. A red warning beacon on the lightbar casts a distinct red glow over the metallic exterior edges of the police car and his face, contrasting with the cold shadows.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "인우가 운전석에서 튀어나온다.",
              "지붕에는 붉은 경광등."
            ],
            "visual_inferences": [
              "fixed_element police_car_beacon: red warning beacon actively illuminated.",
              "fixed_element night_alleyway_environment: low-key, blue-black darkness.",
              "The open door frames his exit and acts as a foreground diagonal."
            ],
            "creative_decisions": [
              "Position the camera at eye level outside the driver's door to emphasize the urgency in his face.",
              "Use the red glow from the lightbar to highlight his rigid expression against the low-key blue-black environment."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "CCTV camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "air conditioner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "apartment building",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "open door of the police car. The door acts as a diagonal foreground boundary"
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lightbar",
                "usage_kind": "anchor",
                "source_phrase": "red warning beacon on the lightbar"
              },
              {
                "owned_token": "parked car",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pavement",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "police car",
                "usage_kind": "anchor",
                "source_phrase": "open door of the police car"
              },
              {
                "owned_token": "scooter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trash bag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "da1de51c9b3f2d2f",
              "owned_hash": "ba52766b12d4cedb",
              "camera_direction_hash": "162ee22f4612331e",
              "owned_usage_hash": "12df40d976c5e814",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "open door of the police car. The door acts as a diagonal foreground boundary",
                  "reason": "The door is used strictly as a compositional boundary and spatial anchor to frame the character, matching the producer's echo of anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "lightbar",
                  "violating_phrase": "red warning beacon on the lightbar",
                  "reason": "The lightbar is referred to as the source of the warning beacon's light effect, acting as a spatial anchor, matching the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "police car",
                  "violating_phrase": "open door of the police car",
                  "reason": "The police car is used as a reference for the character's position and the door opening, consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 11,
        "dependency_reason": "exact_background (same space, new action, consistent background with prior shot)",
        "_shot_index": 3,
        "visible_entities": [
          "C03",
          "L11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 11,
            "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 eye level outside the open driver's door, continue the dolly-in to a medium view angled into the driver's seat as 정인우 pitches his upper body through the opening. Place the door as a diagonal foreground boundary and hold his urgent, hardened face in the inner half of the frame, with his attention cutting toward 김지후(강수리영) beyond camera.",
            "lighting_mood": "Low-key night contrast carries the supported red beacon accent along the car edge while prioritizing the rigidity of 정인우's expression.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "L11"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L07B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "CCTV camera",
              "air conditioner",
              "apartment building",
              "bollard",
              "door",
              "drain",
              "gate",
              "lightbar",
              "parked car",
              "pavement",
              "police car",
              "scooter",
              "streetlight",
              "trash bag",
              "utility pole",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_car_beacon",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A police car is situated in the alleyway. A red warning beacon on its roof is actively illuminated, casting a distinct red glow over the exterior edges of the vehicle and the immediate surrounding space.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "지붕에는 붉은 경광등",
                  "붉은 경광등이 켜진 경찰차가 앞 골목길에 급정거하여",
                  "explicitly illuminated red police beacon",
                  "supported red beacon accent along the car edge"
                ],
                "visual_inferences": [
                  "After the abrupt stop, the vehicle remains stationary in the alleyway while the characters interact.",
                  "The red beacon acts as a localized practical light source on the car's metallic surface."
                ],
                "creative_decisions": [
                  "Use the red beacon to create a sense of urgency and visually anchor the police vehicle in the dark frame."
                ],
                "confidence": "high"
              },
              {
                "element_id": "night_alleyway_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A narrow alleyway in a residential neighborhood at night. The overall environment features a low-key, blue-black darkness, providing a cold and shadowy backdrop that heavily contrasts with the localized red light from the car.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 다세대 주택가 골목 - 밤",
                  "surrounding alley as scale context",
                  "Low-key blue-black night contrast",
                  "Low-key night contrast"
                ],
                "visual_inferences": [
                  "The structures of the multi-family houses forming the alley are largely obscured by shadows, leaving only the immediate street-level area visible."
                ],
                "creative_decisions": [
                  "Maintain a cold blue-black atmospheric tone to heighten the tension of the scene and emphasize the isolated feel of the night street."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C03O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L07B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "76a774b40a1bef93"
      },
      {
        "scene_index": 12,
        "heading": "실내. 민숙 집 - 밤",
        "beat_title": "난장판이 된 거실과 고산들의 등장",
        "representative_moment": "고산들이 부서진 가구와 핏자국이 가득한 거실 한가운데 서서 무심하게 사진액자를 내려다보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide view, low-key night lighting",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level wide view from the entrance reveals a heavily wrecked living room resembling the aftermath of a violent typhoon. Broken pieces of wooden furniture, shattered glass shards, and overturned planters are densely scattered across the floor. Distinct deep red bloodstains are clearly visible on the floor and smeared amid the debris. At the center of the ruined space, an Asian middle-aged man with short hair in a dark jacket stands perfectly still, his full figure modest in scale against the wide room. Positioned at a three-quarter angle from the left, he looks down at a picture frame held loosely in his hand. The frame's content-bearing front face angles toward his body, remaining unreadable to the camera. The interior is enveloped in low-key, high-contrast night lighting, dominated by deep, restrained blue-black shadows and earthy neutral tones, which isolate the man and the bloodstains against the dark room.",
            "outfit_assignments": [],
            "source_facts": [
              "집안은 마치 엄청난 태풍이라도 휩쓸고 간 것처럼 엉망인 상태",
              "부서진 가구며, 깨진 등, 화분, 게다가 여기저기 선명한 핏자국까지",
              "그 난장판 한 가운데 서 있는 남자",
              "사진액자 하나를 보고 있던 모양인데…"
            ],
            "visual_inferences": [
              "fixed_element wrecked_living_room_environment: The debris and bloodstains cover the floor extensively, ensuring they are visible both in wide room shots and tight floor-level angles.",
              "fixed_element low_key_night_lighting: The darkness heavily isolates the subjects and the deep red bloodstains without revealing any visible or unsupported light sources."
            ],
            "creative_decisions": [
              "Placed the unidentified man at the center in a wide framing to emphasize his calm, still presence amidst the extreme destruction of the room.",
              "Oriented the picture frame inward to obscure its contents from the camera, fulfilling the spatial contract for the prop."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bloodstain",
                "usage_kind": "anchor",
                "source_phrase": "Distinct deep red bloodstains"
              },
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coffee table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "debris",
                "usage_kind": "anchor",
                "source_phrase": "smeared amid the debris"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "furniture",
                "usage_kind": "anchor",
                "source_phrase": "Broken pieces of wooden furniture"
              },
              {
                "owned_token": "glass shard",
                "usage_kind": "anchor",
                "source_phrase": "shattered glass shards"
              },
              {
                "owned_token": "planter",
                "usage_kind": "anchor",
                "source_phrase": "overturned planters"
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "soil",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "502f3053b442c1ba",
              "owned_hash": "523e600827d6cf95",
              "camera_direction_hash": "3d308e734ec7b9e2",
              "owned_usage_hash": "e5832d0903e09d23",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bloodstain",
                  "violating_phrase": "Distinct deep red bloodstains are clearly visible on the floor and smeared amid the debris",
                  "reason": "The prompt describes the color and visibility of pre-existing bloodstains to anchor the environment, which is not a request to redraw them.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "debris",
                  "violating_phrase": "smeared amid the debris",
                  "reason": "The prompt mentions the pre-existing debris as a spatial anchor for the bloodstains, aligning with the anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "furniture",
                  "violating_phrase": "Broken pieces of wooden furniture",
                  "reason": "The prompt describes the scattered state of the pre-existing furniture to establish the room's composition, serving as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "glass shard",
                  "violating_phrase": "shattered glass shards",
                  "reason": "The prompt references shattered glass shards to detail the pre-existing wrecked scene without requesting new ones, acting as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "planter",
                  "violating_phrase": "overturned planters",
                  "reason": "The prompt references pre-existing planters in their overturned state to anchor the background composition.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "이전 샷(Scene 4)에서 설정된 거실 공간의 구조와 조명 톤을 바탕으로, 완전히 파괴된 난장판 상태를 연출하기 위함",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the entrance at eye level, complete the revealing pan in a wide view across the wrecked living room and settle on 고산들 at the center amid broken furniture, objects, and visible bloodstains. Keep his full figure comparatively still and modest in scale, with the picture frame held loosely as the final visual stop before the camera advances into the room.",
            "lighting_mood": "Low-key, high-contrast night interior treatment uses restrained blue-black, earthy neutrals, and deep red from the visible bloodstains without specifying an unsupported source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L11B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bloodstain",
              "ceiling light",
              "coffee table",
              "debris",
              "door",
              "furniture",
              "glass shard",
              "planter",
              "sofa",
              "soil",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wrecked_living_room_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The indoor environment is heavily wrecked, resembling the aftermath of a violent typhoon. Broken pieces of wooden furniture, shattered lamps, and overturned potted plants are densely scattered across the floor. Distinct deep red bloodstains are clearly visible on the floor and smeared amid the debris.",
                "applies_to_shots": [
                  2,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "집안은 마치 엄청난 태풍이라도 휩쓸고 간 것처럼 엉망인 상태",
                  "부서진 가구며, 깨진 등, 화분, 게다가 여기저기 선명한 핏자국까지"
                ],
                "visual_inferences": [
                  "The debris and bloodstains cover the floor extensively, ensuring they are visible both in wide room shots and tight floor-level angles."
                ],
                "creative_decisions": [
                  "Maintain consistent textures of shattered wood and ceramics on the floor to emphasize the violence of the preceding unseen event."
                ],
                "confidence": "high"
              },
              {
                "element_id": "low_key_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior is enveloped in low-key, high-contrast night lighting. The overall color palette is dominated by deep, restrained blue-black shadows and earthy neutral tones. The darkness heavily isolates the subjects and the deep red bloodstains without revealing any visible or unsupported light sources.",
                "applies_to_shots": [
                  2,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key, high-contrast night interior treatment uses restrained blue-black, earthy neutrals, and deep red from the visible bloodstains",
                  "without specifying an unsupported source"
                ],
                "visual_inferences": [
                  "The stark contrast heightens the sense of terror and the grim reality of the wrecked space."
                ],
                "creative_decisions": [
                  "Keep the peripheral areas of the frame swallowed by shadow to focus attention entirely on the central subjects and the immediate floor area."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L11B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "3c8d6b0ca8845103"
      },
      {
        "scene_index": 12,
        "heading": "13. 실내. 민숙 집 - 밤",
        "beat_title": "제압당한 지후",
        "representative_moment": "바닥에 쓰러진 지후의 어깨를 산들의 억센 손이 강하게 짓누르고 있는 공포스러운 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing from floor level with low-key, high-contrast night lighting and shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a worker uniform, an East Asian young woman, is pinned supine in the lower-left foreground, looking toward 고산들 above her at a three-quarter angle from the right. C08O13 in a dark work jacket, an East Asian middle-aged man, appears in an over-the-shoulder perspective in the middle-right foreground, reaching for 김지후(강수리영)'s shoulder. Captured from floor level close beside her upper body, his large hand crushes her shoulder firmly against the floorboards. Her terrified, pale face and his thick forearm dominate the composition. The deeper background is omitted through shallow depth of field, emphasizing only the immediate frame-edge surface: a wrecked wooden floor densely scattered with shattered ceramics, broken wood pieces, and smeared deep red bloodstains. Enveloped in low-key, high-contrast night lighting, deep blue-black shadows and earthy neutral tones isolate the subjects, with a dim ambient fill catching the wet bloodstains.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C08",
                "outlook_id": "O13"
              }
            ],
            "source_facts": [
              "지후가 단박에 붙잡혀 바닥에 내동댕이쳐진다.",
              "산들이 무시무시하게 쏘아보며 지후를 제압한다.",
              "지후는 공포에 사색이 된 얼굴.",
              "집안은 부서진 가구와 깨진 등, 선명한 핏자국으로 엉망인 상태."
            ],
            "visual_inferences": [
              "fixed_element: wrecked_living_room_environment (shattered ceramics and bloodstains directly on the floorboard surface)",
              "fixed_element: low_key_night_lighting (blue-black shadows and earthy neutral tones)",
              "The close framing at floor level isolates the physical tension of the hand pinning the shoulder without showing full bodies."
            ],
            "creative_decisions": [
              "Positioned C01 in the lower-left and C08's arm in the middle-right to fulfill the spatial contract while maintaining close framing.",
              "Omitted the [L##] label format as requested, describing the frame-edge floor directly in English common nouns.",
              "Applied shallow depth of field to naturally exclude background references and focus solely on the immediate interaction and bloody debris."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bloodstain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ceiling light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "coffee table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "debris",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "furniture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "glass shard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "planter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sofa",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "soil",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6940959b241ebbf7",
              "owned_hash": "523e600827d6cf95",
              "camera_direction_hash": "53af325b897ace2d",
              "owned_usage_hash": "2484dbedf252b870",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 12,
        "dependency_reason": "Same environment (wrecked house interior) and lighting as the previous shot, zooming in to a sub-region detail.",
        "_shot_index": 10,
        "visible_entities": [
          "C01",
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 12,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From floor level close beside 김지후(강수리영)'s upper body, hold static on 고산들's hand crushing her shoulder fully against the floor, with her terrified face and part of his forearm retained as human scale references. Arrange her diagonally across the lower frame and keep the gripping hand below forty percent of the image, turning the immobility of the composition into the threat.",
            "lighting_mood": "Low-key, high-contrast interior rendering isolates the pressure of the hand and 김지후(강수리영)'s fear without introducing an unsupported light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "고산들 above her",
                  "label": "김지후(강수리영)",
                  "screen_zone": "lower_left",
                  "target_id": "C01",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "reaches_for",
                  "gesture_target_label": "김지후(강수리영)'s shoulder",
                  "label": "고산들",
                  "screen_zone": "middle_right",
                  "target_id": "C08",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C08",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L11B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "wrecked_living_room_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The indoor environment is heavily wrecked, resembling the aftermath of a violent typhoon. Broken pieces of wooden furniture, shattered lamps, and overturned potted plants are densely scattered across the floor. Distinct deep red bloodstains are clearly visible on the floor and smeared amid the debris.",
                "applies_to_shots": [
                  2,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "집안은 마치 엄청난 태풍이라도 휩쓸고 간 것처럼 엉망인 상태",
                  "부서진 가구며, 깨진 등, 화분, 게다가 여기저기 선명한 핏자국까지"
                ],
                "visual_inferences": [
                  "The debris and bloodstains cover the floor extensively, ensuring they are visible both in wide room shots and tight floor-level angles."
                ],
                "creative_decisions": [
                  "Maintain consistent textures of shattered wood and ceramics on the floor to emphasize the violence of the preceding unseen event."
                ],
                "confidence": "high"
              },
              {
                "element_id": "low_key_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior is enveloped in low-key, high-contrast night lighting. The overall color palette is dominated by deep, restrained blue-black shadows and earthy neutral tones. The darkness heavily isolates the subjects and the deep red bloodstains without revealing any visible or unsupported light sources.",
                "applies_to_shots": [
                  2,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key, high-contrast night interior treatment uses restrained blue-black, earthy neutrals, and deep red from the visible bloodstains",
                  "without specifying an unsupported source"
                ],
                "visual_inferences": [
                  "The stark contrast heightens the sense of terror and the grim reality of the wrecked space."
                ],
                "creative_decisions": [
                  "Keep the peripheral areas of the frame swallowed by shadow to focus attention entirely on the central subjects and the immediate floor area."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 12,
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C08O13",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "901ef45fb596b9c6"
      },
      {
        "scene_index": 13,
        "heading": "실외/ 실내. 국도를 달리는 구형 산타페 SUV - 밤",
        "beat_title": "조수석 시점, 전화를 받으며 뒷좌석을 곁눈질하는 산들",
        "representative_moment": "C08이 한 손으로 운전대를 잡고, 다른 손으로 전화를 받으며 고개를 돌려 뒷좌석을 응시하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Observer POV from front passenger area, eye-level medium three-quarter framing, low-key night exposure with high contrast",
            "t2i_prompt": "Photorealistic cinematic still. From the front passenger area at eye level, medium framing captures C08O11 in a dark jacket, a Korean mid-40s man with short black hair and an angular face. He occupies the left half of the frame in a three-quarter profile from the right, his torso slightly twisted. One hand holds a smartphone pressed against his ear, while his other hand grips the top arc of the steering wheel low in the foreground. His chin is turned toward the rear, with his sharp, sidelong gaze fixed on the dark gap beside the driver seat, opening the right side of the composition toward the unseen back seat. The vehicle cabin interior is enveloped in low-key night illumination, defined by subdued blue-black and earthy neutral tones. High-contrast light catches his angular features against the deep shadows. The night road speeds past beyond the closed side window.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "S13 action: '묵묵히 운전대를 잡고 있는 산들. 한 손은 핸드폰을 들고… 슬쩍 뒤를 돌아본다.'",
              "shot description: 핸드폰을 귀에 댄 고산들이 고개를 살짝 돌린 채 차가운 눈빛으로 뒷좌석을 곁눈질하는 찰나."
            ],
            "visual_inferences": [
              "fixed_element suv_night_interior: continuous dark atmosphere with blue-black tones unifies the cabin space.",
              "fixed_element front_seat_structure: the visible driver seat edge anchors the spatial gap leading to the rear.",
              "The sidelong gaze directed toward the empty right frame builds tension regarding the unseen rear passenger."
            ],
            "creative_decisions": [
              "Positioning the character primarily on the left half of the frame to emphasize the spatial void and his attention toward the rear right.",
              "Using high contrast lighting on the turned side of his face to accentuate his sharp eyes and the thriller mood."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blanket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dashboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "driver seat",
                "usage_kind": "anchor",
                "source_phrase": "dark gap beside the driver seat"
              },
              {
                "owned_token": "passenger seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rear window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "restraint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "anchor",
                "source_phrase": "One hand holds a smartphone pressed against his ear"
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "anchor",
                "source_phrase": "his other hand grips the top arc of the steering wheel low in the foreground"
              },
              {
                "owned_token": "vehicle cabin",
                "usage_kind": "anchor",
                "source_phrase": "The vehicle cabin interior is enveloped in low-key night illumination"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "beyond the closed side window"
              },
              {
                "owned_token": "windshield",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "9e00eae534172eee",
              "owned_hash": "824b34c1d9542eb4",
              "camera_direction_hash": "c4c856f0b4fedee4",
              "owned_usage_hash": "640f402fc301b65b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "driver seat",
                  "violating_phrase": "dark gap beside the driver seat",
                  "reason": "The prompt uses the driver seat purely as a spatial reference to define where the character is looking, which aligns with the anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "One hand holds a smartphone pressed against his ear",
                  "reason": "This phrase describes the character holding and pressing the smartphone to his ear, which constitutes allowed prop contact describing physical interaction geometry without redefining its appearance.",
                  "verdict": "allowed_prop_contact"
                },
                {
                  "owned_object": "steering wheel",
                  "violating_phrase": "his other hand grips the top arc of the steering wheel",
                  "reason": "This phrase describes the physical interaction of the hand gripping the steering wheel, qualifying as allowed prop contact without redesigning the wheel itself.",
                  "verdict": "allowed_prop_contact"
                },
                {
                  "owned_object": "vehicle cabin",
                  "violating_phrase": "The vehicle cabin interior is enveloped in low-key night illumination",
                  "reason": "The vehicle cabin is mentioned to describe the ambient lighting of the environment, acting purely as a spatial/lighting anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "beyond the closed side window",
                  "reason": "The window is used as a spatial boundary reference to describe the night road speeding past, serving as an anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 10,
        "dependency_reason": "previous_shot_refs 의존성: S10_Shot5 의 배경(exact_background) 참조",
        "_shot_index": 3,
        "visible_entities": [
          "C08"
        ],
        "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": "From the front passenger area at 고산들's eye level, frame him in a medium three-quarter profile with the steering wheel low in the foreground and the phone held against his ear. The pan ends as his chin turns toward the rear, keeping his face on the left half of the frame and opening the right side toward the unseen back seat so that his sidelong gaze becomes the visual bridge to the next shot.",
            "lighting_mood": "Low-key night exposure keeps the cabin in restrained blue-black and earthy neutral tones with high contrast across 고산들's turned face.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L10B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench seat",
              "blanket",
              "dashboard",
              "door",
              "driver seat",
              "passenger seat",
              "rear window",
              "restraint",
              "smartphone",
              "steering wheel",
              "vehicle cabin",
              "window",
              "windshield"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suv_night_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior cabin of an old SUV driving on a dark country road at night. The environment is enveloped in low-key night illumination, characterized by subdued blue-black and earthy neutral tones. Consistent deep shadows establish a continuous dark atmosphere that unifies the front driving area and the rear passenger section.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "구형 산타페 SUV - 밤",
                  "Low-key night exposure keeps the cabin in restrained blue-black and earthy neutral tones",
                  "The same low-key night illumination... subdued blue-black cabin tones"
                ],
                "visual_inferences": [
                  "The overall ambient lighting remains steady, unifying the separate front and rear sections of the vehicle into a single continuous space."
                ],
                "creative_decisions": [
                  "Utilize the heavy shadows and blue-black color palette to amplify the tension, isolation, and claustrophobia of the nighttime drive."
                ],
                "confidence": "high"
              },
              {
                "element_id": "front_seat_structure",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "The physical structure of the SUV's front seat. It serves as a consistent spatial anchor, with its edge visible to bridge the spatial gap between the front driver area and the rear bench. The seat maintains a dark texture that blends naturally with the low-key cabin lighting.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "From the front passenger area...",
                  "The front seat edge remains at one side as a scale and continuity reference"
                ],
                "visual_inferences": [
                  "The seat acts as a literal boundary and visual bridge that confirms both shots belong to the same confined vehicle interior without needing to show the entire layout."
                ],
                "creative_decisions": [
                  "Keep the front seat edge partially framed in the rear view to maintain a continuous sense of scale and spatial orientation across the cuts."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 10,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L10B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "eb54be1570d5be4c"
      },
      {
        "scene_index": 13,
        "heading": "14. 실외/ 실내. 국도를 달리는 구형 산타페 SUV - 밤",
        "beat_title": "뒷좌석에 결박된 수리영",
        "representative_moment": "어두운 산타페 차량 뒷좌석에 눕혀진 채 손발이 묶이고 두 눈을 꾹 감고 있는 C01의 모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium hold at rear-seat height, capturing the subject arranged diagonally across the bench with heavy blue-black low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a Korean early 20s woman with long black hair and a pale complexion, lies unconscious, slack and limp, arranged sideways and diagonally across the existing rear bench seat. She is viewed at a three-quarter angle from the left with eyes closed, her wrists and ankles visibly bound by the pre-existing restraint. Her closed face occupies the upper third of the composition. The same low-key night illumination isolates her against subdued blue-black vehicle cabin tones. A dark passenger seat back forms a narrow lateral border at one edge of the frame as a spatial anchor. The closed window is angled in the background, keeping the passing night exterior in deep shadow.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S14 action: '뒷자리에 손발이 묶인 지후가 죽은 듯 눈을 감고 누워있다.'",
              "Low-key night exposure keeps the cabin in restrained blue-black and earthy neutral tones"
            ],
            "visual_inferences": [
              "fixed_element suv_night_interior: Consistent deep shadows establish a continuous dark atmosphere.",
              "fixed_element front_seat_structure: The passenger seat acts as a spatial boundary bridging the front and rear areas."
            ],
            "creative_decisions": [
              "Positioned the closed face in the upper third of the frame to emphasize vulnerability while maintaining the diagonal line of the body.",
              "Placed the passenger seat at the frame edge to serve as a continuous spatial anchor without obscuring the main subject."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench seat",
                "usage_kind": "anchor",
                "source_phrase": "across the existing rear bench seat"
              },
              {
                "owned_token": "blanket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dashboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "driver seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passenger seat",
                "usage_kind": "anchor",
                "source_phrase": "A dark passenger seat back forms a narrow lateral border"
              },
              {
                "owned_token": "rear window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "restraint",
                "usage_kind": "anchor",
                "source_phrase": "bound by the pre-existing restraint"
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "vehicle cabin",
                "usage_kind": "anchor",
                "source_phrase": "subdued blue-black vehicle cabin tones"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "The closed window is angled in the background"
              },
              {
                "owned_token": "windshield",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "95d5eb0d77ff39ea",
              "owned_hash": "824b34c1d9542eb4",
              "camera_direction_hash": "11098c0459a4a796",
              "owned_usage_hash": "5e4384d536041538",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bench seat",
                  "violating_phrase": "across the existing rear bench seat",
                  "reason": "The prompt refers to the existing rear bench seat as a surface for the character's position without demanding any redraw, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "passenger seat",
                  "violating_phrase": "A dark passenger seat back forms a narrow lateral border",
                  "reason": "The passenger seat back is used solely as a spatial anchor and lateral border, consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "restraint",
                  "violating_phrase": "bound by the pre-existing restraint",
                  "reason": "The pre-existing restraint is mentioned only to establish the bound state of the character, in line with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "vehicle cabin",
                  "violating_phrase": "subdued blue-black vehicle cabin tones",
                  "reason": "The vehicle cabin is referenced only to describe the environmental color tones, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "The closed window is angled in the background",
                  "reason": "The closed window is referenced only to describe the background composition without requesting any redraw, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 10,
        "dependency_reason": "같은 차량 내부를 공유하며 야간 이동 시의 저조도 조명 톤과 실내 분위기 연속성 유지",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 13,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Continue the rearward track at rear-seat height and settle into a medium hold on 김지후(강수리영), her body arranged diagonally across the rear bench with her closed face in the upper third and both bound wrists and ankles clearly retained within the composition. The front seat edge remains at one side as a scale and continuity reference while the camera holds without changing the preceding night-lighting axis.",
            "lighting_mood": "The same low-key night illumination isolates 김지후(강수리영)'s closed face and restraints against subdued blue-black cabin tones.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L10B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench seat",
              "blanket",
              "dashboard",
              "door",
              "driver seat",
              "passenger seat",
              "rear window",
              "restraint",
              "smartphone",
              "steering wheel",
              "vehicle cabin",
              "window",
              "windshield"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suv_night_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior cabin of an old SUV driving on a dark country road at night. The environment is enveloped in low-key night illumination, characterized by subdued blue-black and earthy neutral tones. Consistent deep shadows establish a continuous dark atmosphere that unifies the front driving area and the rear passenger section.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "구형 산타페 SUV - 밤",
                  "Low-key night exposure keeps the cabin in restrained blue-black and earthy neutral tones",
                  "The same low-key night illumination... subdued blue-black cabin tones"
                ],
                "visual_inferences": [
                  "The overall ambient lighting remains steady, unifying the separate front and rear sections of the vehicle into a single continuous space."
                ],
                "creative_decisions": [
                  "Utilize the heavy shadows and blue-black color palette to amplify the tension, isolation, and claustrophobia of the nighttime drive."
                ],
                "confidence": "high"
              },
              {
                "element_id": "front_seat_structure",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "The physical structure of the SUV's front seat. It serves as a consistent spatial anchor, with its edge visible to bridge the spatial gap between the front driver area and the rear bench. The seat maintains a dark texture that blends naturally with the low-key cabin lighting.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "From the front passenger area...",
                  "The front seat edge remains at one side as a scale and continuity reference"
                ],
                "visual_inferences": [
                  "The seat acts as a literal boundary and visual bridge that confirms both shots belong to the same confined vehicle interior without needing to show the entire layout."
                ],
                "creative_decisions": [
                  "Keep the front seat edge partially framed in the rear view to maintain a continuous sense of scale and spatial orientation across the cuts."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 10,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L10B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "3b19e83c5a9e0e90"
      },
      {
        "scene_index": 14,
        "heading": "실외. 다세대 주택 골목 - 저녁",
        "beat_title": "진술과 긴급한 요청",
        "representative_moment": "정인우가 앰뷸런스 뒷문턱에 앉아 다친 팔을 팔걸이 밴드로 고정한 채 시선 밖을 응시하며 지친 표정으로 앉아 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At seated eye level beside the open rear of the ambulance in a medium frame, dolly-in effect, high-contrast red and blue color shifts.",
            "t2i_prompt": "Photorealistic cinematic still. At seated eye level beside the open rear of the ambulance, a young East Asian man is perched slightly off-center on the threshold. Seen at three-quarter angle from the left, he is looking off-screen with a tired expression. His posture is slightly slouched with shoulders sagging, one arm secured in a medical arm sling, and his free hand resting on the threshold to stabilize his weight. The rear door of the ambulance is wide open, visually framing his seated position. The evening alleyway is illuminated by a flashing red and blue emergency light, bathing the man's face and the surrounding area in tense, high-contrast color shifts.",
            "outfit_assignments": [],
            "source_facts": [
              "앰뷸런스 뒷문턱에 걸터앉은 인우는 한쪽 팔에 팔걸이 밴드를 하고 있다.",
              "빨간색, 파란색 경찰차 경광등이 번뜩이고",
              "저녁"
            ],
            "visual_inferences": [
              "fixed_element inwoo_sling_state: His posture is slightly slouched, with his free hand resting to support his weight.",
              "fixed_element ambulance_rear_threshold: The rear threshold provides a sturdy, flat surface for him to sit on.",
              "The flashing emergency lights overpower the ambient light to cast dramatic shadows on his face."
            ],
            "creative_decisions": [
              "Medium frame at seated eye level to effectively anchor both the character's injured state and the ambulance environment.",
              "Off-center framing to allow the depth of the alley and the flashing lights to emphasize the tense, unsettled mood."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "ambulance",
                "usage_kind": "anchor",
                "source_phrase": "open rear of the ambulance"
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blanket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "emergency light",
                "usage_kind": "anchor",
                "source_phrase": "flashing red and blue emergency light"
              },
              {
                "owned_token": "medical bag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "medical cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rear door",
                "usage_kind": "anchor",
                "source_phrase": "The rear door of the ambulance is wide open"
              },
              {
                "owned_token": "step",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stretcher",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "anchor",
                "source_phrase": "perched slightly off-center on the threshold"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "10cd566225ad08c9",
              "owned_hash": "c0c7bf37b1f25883",
              "camera_direction_hash": "86bda36926b31fc0",
              "owned_usage_hash": "ec971190a3323801",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "ambulance",
                  "violating_phrase": "open rear of the ambulance",
                  "reason": "The prompt uses the ambulance purely as a spatial anchor to describe the character's seated position, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "emergency light",
                  "violating_phrase": "flashing red and blue emergency light",
                  "reason": "The emergency light is mentioned to define the scene's ambient lighting and color shifts rather than to redraw the physical light itself, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rear door",
                  "violating_phrase": "The rear door of the ambulance is wide open",
                  "reason": "The prompt describes the rear door to visually frame the character, acting as a structural anchor, which is consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "threshold",
                  "violating_phrase": "perched slightly off-center on the threshold",
                  "reason": "The threshold is referenced as a physical support surface for the character to sit and rest his hand on, serving as a clear spatial anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At seated eye level beside the open rear of the ambulance, complete the dolly-in on 정인우 in a medium frame, placing him slightly off-center with the rear threshold and supported arm fully readable. Catch him perched rather than posed, shoulders sagging and his free hand stabilizing his weight as the shallow approach prepares to arc around his side.",
            "lighting_mood": "Evening ambient light is punctuated by the explicitly flashing red and blue police lights, leaving 정인우's tired face in tense, high-contrast color shifts.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L13B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "ambulance",
              "bench",
              "blanket",
              "emergency light",
              "medical bag",
              "medical cabinet",
              "rear door",
              "step",
              "stretcher",
              "threshold"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "inwoo_sling_state",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A young Korean man is seated on the open rear threshold of an ambulance. One of his arms is secured and supported by a medical arm sling. His posture is slightly slouched, with his free hand resting to support his weight.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "앰뷸런스 뒷문턱에 걸터앉은 인우는 한쪽 팔에 팔걸이 밴드를 하고 있다.",
                  "shoulders sagging and his free hand stabilizing his weight"
                ],
                "visual_inferences": [
                  "The sling covers the forearm and loops around the neck or shoulder.",
                  "He remains seated on the same edge of the vehicle across the sequence."
                ],
                "creative_decisions": [
                  "The sling is a typical dark or neutral-colored fabric medical sling."
                ],
                "confidence": "high"
              },
              {
                "element_id": "police_lights_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The evening environment is heavily illuminated by explicitly flashing red and blue police lights. The surrounding area and the figures within it are bathed in stark, high-contrast red and blue color shifts.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "빨간색, 파란색 경찰차 경광등이 번뜩이고",
                  "저녁",
                  "flashing red and blue police lights"
                ],
                "visual_inferences": [
                  "The primary light sources casting shadows and highlights on the characters' faces are the emergency vehicle lights."
                ],
                "creative_decisions": [
                  "The flashing lights are bright enough to overpower the natural evening ambient light, emphasizing dramatic tension."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ambulance_rear_threshold",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "The rear section of an ambulance is parked with its back doors wide open. The rear threshold and bumper are exposed, providing a sturdy, flat surface where a person can sit.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "앰뷸런스 뒷문턱",
                  "open rear of the ambulance"
                ],
                "visual_inferences": [
                  "The ambulance is stationary in the alleyway."
                ],
                "creative_decisions": [
                  "The ambulance interior is dimly lit and mostly empty in the visible background, ensuring the focus remains on the threshold area."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L13B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "74a43dcbb44222c5"
      },
      {
        "scene_index": 14,
        "heading": "15. 실외. 다세대 주택 골목 - 저녁",
        "beat_title": "노 형사의 의구심 어린 시선",
        "representative_moment": "구급차 뒤편에 앉아 치료를 받는 정인우의 어깨 너머로, 그를 향해 의심 가득한 굳은 시선을 보내는 노 형사의 얼굴이 선명하게 잡힌다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight over-the-shoulder focus, eye-level angle, high-contrast red and blue lighting",
            "t2i_prompt": "Photorealistic cinematic still. From a tight over-the-shoulder perspective, a middle-aged Korean male detective in a dark jacket is captured in sharp focus slightly right of center, seen at a three-quarter angle from the right, his body leaning forward toward the seated figure. His eyes are fixed on the young man with a set, deeply doubtful expression. In the soft out-of-focus foreground, the blurred back and shoulder of a young Korean man form the frame edge, his arm secured in a fabric medical sling, anchoring his seated position on the shared open rear threshold of an ambulance below. The immediate space is heavily bathed in stark, high-contrast red and blue color shifts from explicitly flashing police lights, carving firm shadows across the detective's face against the dim surface of the ambulance interior directly behind them.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: 앰뷸런스 쪽에 앉은 정인우를 향해 의구심 가득한 굳은 시선을 던지는 노 형사의 얼굴.",
              "인우: 앰뷸런스 뒷문턱에 걸터앉은 인우는 한쪽 팔에 팔걸이 밴드를 하고 있다.",
              "노 형사: 다세대 주택을 나와 인우에게 다가오는 40대 선배 노 형사.",
              "환경: 빨간색, 파란색 경찰차 경광등이 번뜩이고, 저녁"
            ],
            "visual_inferences": [
              "fixed_element inwoo_sling_state: A young Korean man is seated on the open rear threshold of an ambulance, arm in a medical sling.",
              "fixed_element police_lights_environment: The evening environment is bathed in stark, high-contrast red and blue color shifts.",
              "fixed_element ambulance_rear_threshold: Rear section of an ambulance with back doors open, providing a shared spatial anchor.",
              "The over-the-shoulder framing naturally blurs the young man's sling and shoulder in the foreground while maintaining sharp focus on the detective's face."
            ],
            "creative_decisions": [
              "Close framing concentrates entirely on the detective's doubtful expression, using the young man's sling as a foreground depth anchor without showing his face.",
              "High-contrast red and blue lighting heightens the tension of the interrogation moment.",
              "The background is restricted to the immediate frame edge of the ambulance interior to comply with close-framing skip rules."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "ambulance",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blanket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "emergency light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "medical bag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "medical cabinet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rear door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "step",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stretcher",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0921aed8363bbcea",
              "owned_hash": "c0c7bf37b1f25883",
              "camera_direction_hash": "6a50bc922c465f72",
              "owned_usage_hash": "6c1dced2cbb15364",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "동일 씬 내 이전 샷(Shot 2)의 구급차, 팔걸이 밴드, 경찰 경광등 조명 등 시공간적 물리 상태를 일관되게 유지",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 14,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Settle just behind and beside 정인우 at 노 형사's eye level, using 정인우's shoulder and sling as a soft foreground over-the-shoulder frame while 노 형사's doubtful face holds sharp focus at close range. Keep 노 형사 slightly right of center, his body inclined toward the seated man, so the tightened camera distance alone intensifies the interrogation.",
            "lighting_mood": "The evening scene retains flashing red and blue police illumination, with firm contrast emphasizing 노 형사's doubtful eyes and set expression.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L13B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "inwoo_sling_state",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A young Korean man is seated on the open rear threshold of an ambulance. One of his arms is secured and supported by a medical arm sling. His posture is slightly slouched, with his free hand resting to support his weight.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "앰뷸런스 뒷문턱에 걸터앉은 인우는 한쪽 팔에 팔걸이 밴드를 하고 있다.",
                  "shoulders sagging and his free hand stabilizing his weight"
                ],
                "visual_inferences": [
                  "The sling covers the forearm and loops around the neck or shoulder.",
                  "He remains seated on the same edge of the vehicle across the sequence."
                ],
                "creative_decisions": [
                  "The sling is a typical dark or neutral-colored fabric medical sling."
                ],
                "confidence": "high"
              },
              {
                "element_id": "police_lights_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The evening environment is heavily illuminated by explicitly flashing red and blue police lights. The surrounding area and the figures within it are bathed in stark, high-contrast red and blue color shifts.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "빨간색, 파란색 경찰차 경광등이 번뜩이고",
                  "저녁",
                  "flashing red and blue police lights"
                ],
                "visual_inferences": [
                  "The primary light sources casting shadows and highlights on the characters' faces are the emergency vehicle lights."
                ],
                "creative_decisions": [
                  "The flashing lights are bright enough to overpower the natural evening ambient light, emphasizing dramatic tension."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ambulance_rear_threshold",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "The rear section of an ambulance is parked with its back doors wide open. The rear threshold and bumper are exposed, providing a sturdy, flat surface where a person can sit.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "앰뷸런스 뒷문턱",
                  "open rear of the ambulance"
                ],
                "visual_inferences": [
                  "The ambulance is stationary in the alleyway."
                ],
                "creative_decisions": [
                  "The ambulance interior is dimly lit and mostly empty in the visible background, ensuring the focus remains on the threshold area."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "685c65262b572e9d"
      },
      {
        "scene_index": 15,
        "heading": "16. 실내. 구형 산타페 SUV - 새벽",
        "beat_title": "두려움에 떨며 깨어난 지후",
        "representative_moment": "A young woman lies bound on the rear bench seat of the SUV, opening her eyes wide with fear and looking toward the front.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium frame from the gap between the front seats aiming rearward and slightly downward, cool pale dawn ambient lighting",
            "t2i_prompt": "Photorealistic cinematic still. Seen from the gap between the front seats, aiming rearward and slightly downward in a medium frame. The dark, rear-facing sides of the front seat edges flank the image on the left and right, forming a narrow inner frame. Beyond the gap, a young East Asian woman in casual clothes lies bound diagonally across the rear bench seat. Viewed at three-quarter angle from the right, her body is positioned horizontally with shoulders drawn inward tightly due to the restraints. Her suddenly opened face occupies the upper central area, eyes wide with fear, fixed on the unseen figure in the front. The interior of the SUV is immersed in a low-key, pale dawn ambient light. Soft, cool-toned light filters through the closed windows, casting deep blue-black shadows across the cramped cabin space and retaining a dark, subdued atmosphere.",
            "outfit_assignments": [],
            "source_facts": [
              "뒷좌석에 결박된 김지후(강수리영)",
              "지후가 그대로 누운 채 눈을 뜨고 있다. 두려움 가득한 얼굴.",
              "희끄무레 밝아오는 새벽 하늘"
            ],
            "visual_inferences": [
              "fixed_element ji_hoo_bound_posture: horizontal positioning with shoulders drawn inward",
              "fixed_element suv_dawn_interior: pale dawn light filtering through closed windows casting deep shadows",
              "camera position looking rearward through the gap between front seats"
            ],
            "creative_decisions": [
              "Use the edges of the front seats as a foreground framing device to emphasize the cramped and claustrophobic interior",
              "Enhance the suspense by maintaining deep blue-black shadows contrasting with the pale dawn light on her fearful face"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "SUV",
                "usage_kind": "anchor",
                "source_phrase": "The interior of the SUV is immersed"
              },
              {
                "owned_token": "center console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dashboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "front seat",
                "usage_kind": "anchor",
                "source_phrase": "The dark, rear-facing sides of the front seat edges flank the image"
              },
              {
                "owned_token": "rear bench seat",
                "usage_kind": "anchor",
                "source_phrase": "lies bound diagonally across the rear bench seat"
              },
              {
                "owned_token": "rearview mirror",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "restraint",
                "usage_kind": "redraw",
                "source_phrase": "shoulders drawn inward tightly due to the restraints"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "light filters through the closed windows"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5f3e62bfdcf43f39",
              "owned_hash": "1f8fc281baf22449",
              "camera_direction_hash": "31290995972f2b5c",
              "owned_usage_hash": "e708c99766766374",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "SUV",
                  "violating_phrase": "The interior of the SUV is immersed",
                  "reason": "The prompt references the SUV interior solely to describe the ambient lighting, matching the producer's declaration of an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "front seat",
                  "violating_phrase": "The dark, rear-facing sides of the front seat edges flank the image",
                  "reason": "The prompt uses the front seat edges as a framing device, matching the producer's declaration of an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rear bench seat",
                  "violating_phrase": "lies bound diagonally across the rear bench seat",
                  "reason": "The prompt references the rear bench seat as a positional anchor for the character, matching the producer's declaration of an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "restraint",
                  "violating_phrase": "shoulders drawn inward tightly due to the restraints",
                  "reason": "The prompt mentions restraints only to describe the character's physical posture, meaning it is an anchor reference rather than a redraw.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "light filters through the closed windows",
                  "reason": "The prompt references the windows as a source of ambient light, matching the producer's declaration of an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 4,
        "dependency_reason": "Same SUV interior space as established in prior scenes, requiring consistent background elements.",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 15,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the gap between the front seats at seat-back height, aim rearward and slightly downward in a medium frame, placing 김지후(강수리영)'s bound body diagonally across the rear bench while her suddenly opened face occupies the upper central area. Hold the front-seat edges as a narrow frame within the frame as she draws her shoulders inward and looks naturally upward toward 고산들 in the front.",
            "lighting_mood": "Pale dawn ambient light enters the low-key cabin, retaining blue-black shadows while revealing the fear in 김지후(강수리영)'s opened eyes.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L11B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "SUV",
              "center console",
              "dashboard",
              "door",
              "front seat",
              "rear bench seat",
              "rearview mirror",
              "restraint",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "ji_hoo_bound_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young woman is lying bound across the rear bench seat of a vehicle. Her body is positioned horizontally, with her shoulders drawn inward tightly due to the restraints, and her head is angled forward as she looks toward the front seat.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "뒷좌석에 결박된 김지후(강수리영)",
                  "지후가 그대로 누운 채",
                  "lying bound diagonally across the rear bench",
                  "shoulders drawn inward"
                ],
                "visual_inferences": [
                  "Her hands or upper body are tied, forcing her into a tense, restricted posture on the seat."
                ],
                "creative_decisions": [
                  "Emphasize her physical vulnerability by keeping her body low against the car seat, struggling against the bindings."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suv_dawn_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the vehicle is immersed in a low-key, pale dawn ambient light. Soft, cool-toned light filters through the windows, casting deep blue-black shadows across the cramped cabin space and maintaining a dark, subdued atmosphere.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "희끄무레 밝아오는 새벽 하늘",
                  "Pale dawn ambient light enters the low-key cabin",
                  "retaining blue-black shadows"
                ],
                "visual_inferences": [
                  "The lack of interior lighting makes the characters' silhouettes blend with the dark corners of the car, with only the soft light from outside revealing their faces."
                ],
                "creative_decisions": [
                  "Use a cool, bluish color palette for the ambient light to enhance the suspense and cold reality of the situation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 4,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L11B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "2f18b76e8b5a21d5"
      },
      {
        "scene_index": 15,
        "heading": "실내. 구형 산타페 SUV - 새벽",
        "beat_title": "거울을 통한 묵직한 시선 교환",
        "representative_moment": "산들은 룸미러를 통해 뒷좌석에 묶인 지후를 흔들리는 눈빛으로 응시하고, 지후는 두려움 속에서 그 거울 속 눈을 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Centered rear cabin view at seated eye height, close focus on the rearview mirror",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from seated eye height, in the upper-center background, the rearview mirror reflecting the eyes of an Asian middle-aged man in dark workwear occupies the frame, sharing the same vehicle cabin with the foreground figure. The mirror surface reflects a horizontally reversed view of the man facing the camera, his heavy, wavering eyes fixed on the woman, enclosed by the visible mirror frame. In the lower foreground, the same young Asian woman is lying bound horizontally across the same rear bench seat, a restrained portion of her head and shoulder in frame. Her back is to the camera, her head angled forward, shoulders drawn inward tightly due to the restraints, her eyes fixed on the man's reflection. [: The interior is immersed in the same low-key, pale dawn ambient light, casting deep blue-black shadows across the same cramped space.] The front windshield lies beyond the mirror, maintaining the subdued dawn waterfront.",
            "outfit_assignments": [],
            "source_facts": [
              "지후가 그대로 누운 채",
              "lying bound diagonally across the rear bench",
              "shoulders drawn inward",
              "희끄무레 밝아오는 새벽 하늘",
              "Pale dawn ambient light enters the low-key cabin"
            ],
            "visual_inferences": [
              "The mirror frame makes the confrontation explicit without cutting away",
              "The lack of interior lighting makes the characters' silhouettes blend with the dark corners of the car"
            ],
            "creative_decisions": [
              "Close framing focusing on the rearview mirror in the upper center and the bound woman in the lower foreground",
              "Use 'the same' continuity tokens to strictly follow the zoom_in_detail constraint",
              "Explicitly mention the shared vehicle cabin to anchor foreground and background, omitting L11 ID as requested"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "SUV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "center console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dashboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "front seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rear bench seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rearview mirror",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "restraint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a7e8a3eefc0966d1",
              "owned_hash": "1f8fc281baf22449",
              "camera_direction_hash": "4a17045a8e7962bb",
              "owned_usage_hash": "79a529028bd9333f",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 15,
        "dependency_reason": "zoom_in_detail from previous shot (Shot 3) maintaining the same environment and moment",
        "_shot_index": 5,
        "visible_entities": [
          "C08"
        ],
        "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 centered rear cabin at seated eye height, compose the rearview mirror in the upper center and hold 고산들's reflected eyes in close focus, with a restrained portion of 김지후(강수리영)'s bound head and shoulder low in the foreground as the object of his gaze. The mirror frame and reversed reflection make the confrontation explicit without cutting away, while the rest of the cabin remains secondary.",
            "lighting_mood": "Pale dawn ambient light leaves the cabin subdued while giving 고산들's reflected eyes enough contrast to register their heavy, wavering focus.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "rearview mirror reflecting 고산들's eyes",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L11B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "ji_hoo_bound_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young woman is lying bound across the rear bench seat of a vehicle. Her body is positioned horizontally, with her shoulders drawn inward tightly due to the restraints, and her head is angled forward as she looks toward the front seat.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "뒷좌석에 결박된 김지후(강수리영)",
                  "지후가 그대로 누운 채",
                  "lying bound diagonally across the rear bench",
                  "shoulders drawn inward"
                ],
                "visual_inferences": [
                  "Her hands or upper body are tied, forcing her into a tense, restricted posture on the seat."
                ],
                "creative_decisions": [
                  "Emphasize her physical vulnerability by keeping her body low against the car seat, struggling against the bindings."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suv_dawn_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the vehicle is immersed in a low-key, pale dawn ambient light. Soft, cool-toned light filters through the windows, casting deep blue-black shadows across the cramped cabin space and maintaining a dark, subdued atmosphere.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "희끄무레 밝아오는 새벽 하늘",
                  "Pale dawn ambient light enters the low-key cabin",
                  "retaining blue-black shadows"
                ],
                "visual_inferences": [
                  "The lack of interior lighting makes the characters' silhouettes blend with the dark corners of the car, with only the soft light from outside revealing their faces."
                ],
                "creative_decisions": [
                  "Use a cool, bluish color palette for the ambient light to enhance the suspense and cold reality of the situation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 15,
                "shot_index": 3,
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "ee940e4b99806d90"
      },
      {
        "scene_index": 16,
        "heading": "실내. 경찰서 형사과 - 같은 시각",
        "beat_title": "CCTV 확인 후 커지는 분노",
        "representative_moment": "모니터 불빛에 비친 정인우가 찌푸린 미간과 적개심 가득한 표정으로 화면을 응시하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close frame, low-key cool monitor illumination, neutral shadows for intense contrast",
            "t2i_prompt": "Photorealistic cinematic still. In a close frame at eye level, a Korean man in his 30s is seen in left three-quarter profile, leaning close to a monitor. His furrowed brow, narrowed eyes, and tightened jaw occupy most of the image, his eyes fixed off-screen with an intense, hostile expression. He remains hunched forward, the fabric of a medical arm sling resting across his torso and only partly entering the lower frame. A narrow edge of the computer monitor remains visible near his eyeline in the foreground, facing him. The active screen casts a cool, low-key illumination that shapes his face in sharp contrast, with restrained neutral shadows sharpening his features against the soft, dim background of a receding workstation.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 2 description: Jung In-woo looking at the monitor with a hostile expression, furrowing his brow.",
              "DP notes: observer POV, front three-quarter angle, close frame on furrowed brow and narrowed eyes."
            ],
            "visual_inferences": [
              "fixed_element jung_in_woo_medical_sling: He wears a medical arm sling supporting his injured arm, fabric resting across his torso, partly in the lower frame.",
              "fixed_element workstation_monitor_lighting: The glowing screen casts a cool, low-key illumination on his face, leaving the background dim."
            ],
            "creative_decisions": [
              "Kept the framing extremely tight on the face to emphasize the psychological tension and hostility without being distracted by the background.",
              "Placed a sliver of the monitor at the edge of the frame to anchor the primary light source and direction of his gaze."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "SUV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "center console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dashboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "laptop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "windshield",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "10363e00bc28b9bb",
              "owned_hash": "b3d3877185f65b67",
              "camera_direction_hash": "988fe8642ece4844",
              "owned_usage_hash": "749a40514f320aeb",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 14,
        "dependency_reason": "경찰서 형사과 내부의 동일한 공간적 분위기(workstation, monitor lighting)를 유지하기 위해 이전 씬의 location 배경 톤을 참조",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 정인우's eye height and a front three-quarter angle, hold a close frame in which his furrowed brow, narrowed eyes, and tightened jaw occupy most of the image while a narrow monitor edge remains near his eyeline. His torso pitches toward the footage, with the sling only partly entering the lower frame so that the hostile expression remains primary.",
            "lighting_mood": "The monitor's stated light shapes 정인우's face in low-key contrast, with restrained neutral shadows sharpening his hostility.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L13B04",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "jung_in_woo_medical_sling",
                "element_type": "character_state",
                "character_name": "Jung In-woo",
                "description": "Jung In-woo wears a medical arm sling that supports his injured arm. The fabric of the sling rests across his torso, visibly securing his arm against his body while he remains hunched forward. The sling remains a constant feature on his upper body.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "여전히 팔걸이 밴드를 한 인우 (Inwoo, still wearing an arm sling)",
                  "the sling only partly entering the lower frame (Shot 2)",
                  "the supported arm (Shot 4)"
                ],
                "visual_inferences": [
                  "The sling is a standard medical fabric band meant to immobilize the arm.",
                  "His posture is slightly hunched and restricted due to the presence of the sling."
                ],
                "creative_decisions": [
                  "Keeping the sling visible even in tight frames visually reinforces his recent trauma and vulnerable physical state despite his aggressive focus."
                ],
                "confidence": "high"
              },
              {
                "element_id": "workstation_monitor_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An active computer monitor sits on the workstation desk, functioning as the primary light source for the immediate area. The glowing screen casts a cool, low-key illumination that highlights the desk surface and the person seated in front of it, leaving the surrounding environment somewhat dim.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "컴퓨터 모니터 화면 (Computer monitor screen)",
                  "The monitor's stated light shapes Jung In-woo's face in low-key contrast (Shot 2)",
                  "The active monitor and phone displays provide the explicitly motivated low-key illumination (Shot 4)"
                ],
                "visual_inferences": [
                  "The general lighting in this section of the police station is subdued enough for the monitor light to dominate the immediate space."
                ],
                "creative_decisions": [
                  "The low-key, directional light from the monitor is used to enhance the tense, dramatic atmosphere of the investigation process."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 14,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "b44c8a74220d5b44"
      },
      {
        "scene_index": 16,
        "heading": "17. 실내. 경찰서 형사과 - 같은 시각",
        "beat_title": "지후의 충격적인 문자 메시지 확인",
        "representative_moment": "A close insert of a smartphone in a man's hand displaying a text message, illuminated by the phone and a nearby computer monitor.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Insert framing from an over-the-shoulder downward angle, cool low-key lighting.",
            "t2i_prompt": "Photorealistic cinematic still. A glowing smartphone occupies the central third of the frame, firmly cradled in one hand by a Korean adult man seen from an over-the-shoulder downward angle. He is hunched forward, looking down at the screen, with a medical arm sling supporting his injured arm across his lower torso. The smartphone's front display is nearly square to the lens, showing a legible text message. Around his gripping hand, a workstation desk surface is partially visible. In the periphery, an active computer monitor faces obliquely away, displaying blurred CCTV footage. The scene is bathed in cool, low-key illumination emanating from the monitor and phone screen, casting tense highlights on his fingers against the dim surrounding space.",
            "outfit_assignments": [],
            "source_facts": [
              "Inwoo checking his phone which displays a text message from Jihoo",
              "The message mentions going to Geumwol Island",
              "He is still wearing an arm sling",
              "They are at the police station desk with a computer monitor"
            ],
            "visual_inferences": [
              "fixed_element jung_in_woo_medical_sling: his injured arm is supported across his torso while he hunches over the phone",
              "fixed_element workstation_monitor_lighting: the monitor and the phone screen are the primary light sources, creating a low-key atmosphere",
              "Over-the-shoulder insert focuses heavily on the device screen and the tense grip of his hand"
            ],
            "creative_decisions": [
              "Positioned the smartphone in the central third, almost square to the lens, to emphasize the text message while maintaining the character's physical context",
              "Used cool, low-key lighting from the screens to contrast against the dim background, enhancing the dramatic realization"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "SUV",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "center console",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dashboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "laptop",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "seat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "redraw",
                "source_phrase": "A glowing smartphone occupies the central third of the frame"
              },
              {
                "owned_token": "steering wheel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "windshield",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d9ecc248557c4f32",
              "owned_hash": "b3d3877185f65b67",
              "camera_direction_hash": "f6702535d938ec87",
              "owned_usage_hash": "6e3aebf2f909bbe3",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "A glowing smartphone occupies the central third of the frame... showing a legible text message",
                  "reason": "The prompt specifies the smartphone showing a legible text message, which is allowed under visual state change because the shot_intent explicitly requires 'a smartphone in a man's hand displaying a text message'.",
                  "verdict": "allowed_visual_state_change"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "Shares the same spatial environment and lighting setup as the previous shots in the police station.",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 16,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the downward tilt above 정인우's hands into an insert where the phone display occupies the central third rather than overwhelming the frame, surrounded by his gripping hand, the supported arm, and part of the workstation for scale. Keep the screen plane nearly square to the lens so the message remains legible while his tense fingers reveal his reaction.",
            "lighting_mood": "The active monitor and phone displays provide the explicitly motivated low-key illumination, keeping the palette neutral and tense around the legible message.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L13B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "SUV",
              "bench seat",
              "center console",
              "dashboard",
              "laptop",
              "seat",
              "smartphone",
              "steering wheel",
              "window",
              "windshield"
            ],
            "camera_reference": null,
            "close_framing_skips_background_ref": false,
            "constraints": [
              "owned_objects lists all environment objects already drawn in the background reference — do not create new ones",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "jung_in_woo_medical_sling",
                "element_type": "character_state",
                "character_name": "Jung In-woo",
                "description": "Jung In-woo wears a medical arm sling that supports his injured arm. The fabric of the sling rests across his torso, visibly securing his arm against his body while he remains hunched forward. The sling remains a constant feature on his upper body.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "여전히 팔걸이 밴드를 한 인우 (Inwoo, still wearing an arm sling)",
                  "the sling only partly entering the lower frame (Shot 2)",
                  "the supported arm (Shot 4)"
                ],
                "visual_inferences": [
                  "The sling is a standard medical fabric band meant to immobilize the arm.",
                  "His posture is slightly hunched and restricted due to the presence of the sling."
                ],
                "creative_decisions": [
                  "Keeping the sling visible even in tight frames visually reinforces his recent trauma and vulnerable physical state despite his aggressive focus."
                ],
                "confidence": "high"
              },
              {
                "element_id": "workstation_monitor_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An active computer monitor sits on the workstation desk, functioning as the primary light source for the immediate area. The glowing screen casts a cool, low-key illumination that highlights the desk surface and the person seated in front of it, leaving the surrounding environment somewhat dim.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "컴퓨터 모니터 화면 (Computer monitor screen)",
                  "The monitor's stated light shapes Jung In-woo's face in low-key contrast (Shot 2)",
                  "The active monitor and phone displays provide the explicitly motivated low-key illumination (Shot 4)"
                ],
                "visual_inferences": [
                  "The general lighting in this section of the police station is subdued enough for the monitor light to dominate the immediate space."
                ],
                "creative_decisions": [
                  "The low-key, directional light from the monitor is used to enhance the tense, dramatic atmosphere of the investigation process."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L13B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "78ed34c10c6aa1cf"
      },
      {
        "scene_index": 17,
        "heading": "실외. 달리는 낚시 어선 - 낮",
        "beat_title": "탁 트인 바다를 가로지르는 어선과 선수에 선 인물",
        "representative_moment": "A wide high-angle shot of a fishing vessel advancing across the blue sea, with a male figure standing rigidly at the bow.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "high-angle wide establishing shot, natural clear daylight",
            "t2i_prompt": "Photorealistic cinematic still. A high-angle wide establishing composition, looking down from outside the vessel's path. A small fishing vessel advancing bow-first through the lower-center frame, generating scattered white foam behind its hull across a vibrant, deep blue ocean. The entire fishing vessel occupies the lower third of the image, the expansive blue sea dominating the upper frame to establish the vast scale. At the very front tip of the bow, a male figure standing rigidly, maintaining an upright, motionless posture like a statue, back turned to the stern, gazing toward the distant ocean. The wheelhouse, mast, and railing positioned on the deck behind him. Lit by clear natural daytime sunlight, rendering the water brightly while maintaining restrained contrast across the boat's exterior.",
            "outfit_assignments": [],
            "source_facts": [
              "화면 가득 푸르게 넘실대는 바다에 5톤 짜리 낚시 어선이 하얀 포말을 만들며 지나간다",
              "뱃머리에는 산들이 지휘자처럼 홀로 서서 탁 트인 바다를 감상하듯 바라본다",
              "목석 같은 모습이다"
            ],
            "visual_inferences": [
              "fixed_element fishing_boat_sea_environment: A small 5-ton fishing boat navigates steadily across a vibrant, deep blue ocean",
              "fixed_element go_sandeul_bow_stance: A male figure stands rigidly at the very front tip of the boat's bow",
              "omniscient high-angle wide framing to capture both the isolated figure at the bow and the vast surrounding sea"
            ],
            "creative_decisions": [
              "Positioning the full vessel in the lower third of the frame to make the blue sea the principal scale reference",
              "Using natural daytime sunlight to create a strong contrast between the deep blue ocean and the white foam"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "antenna",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "buoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing vessel",
                "usage_kind": "anchor",
                "source_phrase": "A small fishing vessel advancing bow-first"
              },
              {
                "owned_token": "lifebuoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "anchor",
                "source_phrase": "The wheelhouse, mast, and railing positioned on the deck behind him"
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "anchor",
                "source_phrase": "The wheelhouse, mast, and railing positioned on the deck behind him"
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "anchor",
                "source_phrase": "The wheelhouse, mast, and railing positioned on the deck behind him"
              },
              {
                "owned_token": "winch",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "fcd6ad8762456964",
              "owned_hash": "5afcf5e51e37cbf2",
              "camera_direction_hash": "700542e086282560",
              "owned_usage_hash": "5d4b3a12a32cda13",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "fishing vessel",
                  "violating_phrase": "A small fishing vessel advancing bow-first",
                  "reason": "The prompt mentions the fishing vessel's movement and position to establish scale and framing, without redraw instructions, matching the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "mast",
                  "violating_phrase": "The wheelhouse, mast, and railing positioned on the deck behind him",
                  "reason": "The prompt mentions the mast merely as a background element on the deck behind the character for compositional context, matching the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "railing",
                  "violating_phrase": "The wheelhouse, mast, and railing positioned on the deck behind him",
                  "reason": "The prompt references the railing as a static spatial anchor behind the character, matching the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wheelhouse",
                  "violating_phrase": "The wheelhouse, mast, and railing positioned on the deck behind him",
                  "reason": "The prompt mentions the wheelhouse purely as a background element on the deck behind the character for spatial layout, matching the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 17,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track high and forward outside the vessel's path, looking down in a wide establishing composition as the fishing boat advances bow-first through the lower center and leaves white foam behind it. Keep the full vessel below roughly one third of the image so the blue sea remains the principal scale reference and its direction of travel reads immediately.",
            "lighting_mood": "Natural daytime light renders the blue sea and white foam clearly while maintaining restrained contrast across the vessel.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L14B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "antenna",
              "buoy",
              "fishing net",
              "fishing vessel",
              "lifebuoy",
              "mast",
              "navigation light",
              "radar",
              "railing",
              "rope",
              "wheelhouse",
              "winch"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "go_sandeul_bow_stance",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "A male figure stands rigidly at the very front tip of the boat's bow. He maintains an upright, motionless posture like a statue, with his feet firmly braced on the deck and his back turned to the main passenger area, gazing out at the distant ocean.",
                "applies_to_shots": [
                  1,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "뱃머리에는 산들이 지휘자처럼 홀로 서서 탁 트인 바다를 감상하듯 바라본다",
                  "목석 같은 모습이다",
                  "feet braced at the bow",
                  "back-facing figure at the distant upper center"
                ],
                "visual_inferences": [
                  "Even in the extreme wide exterior shot (Shot 1), his solitary silhouette is distinctly visible standing at the front tip of the boat."
                ],
                "creative_decisions": [
                  "Positioning his silhouette as a striking, stoic vertical line at the bow to emphasize his isolation and deep contemplation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "fishing_boat_sea_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A small 5-ton fishing boat navigates steadily across a vibrant, deep blue ocean, generating white foam in its wake. The surrounding environment is bright, illuminated by clear, natural daytime sunlight that sharply contrasts the boat against the vast expanse of the open water.",
                "applies_to_shots": [
                  1,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "화면 가득 푸르게 넘실대는 바다에 5톤 짜리 낚시 어선이 하얀 포말을 만들며 지나간다",
                  "Natural daytime light renders the blue sea and white foam clearly"
                ],
                "visual_inferences": [
                  "The deck of the boat is exposed to the bright natural sunlight, creating strong visibility along its passages from stern to bow."
                ],
                "creative_decisions": [
                  "Using a vivid color palette for the blue sea to contrast with the more neutral, earthy tones of the boat's deck and exterior."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L14B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "5c326035a613228c"
      },
      {
        "scene_index": 17,
        "heading": "18. 실외. 달리는 낚시 어선 - 낮",
        "beat_title": "상념에 잠긴 지후와 뱃머리의 산들",
        "representative_moment": "지후가 통로 너머 뱃머리에 목석처럼 서 있는 산들의 뒷모습을 물끄러미 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide composition from seated-to-standing eye height with deep focus along a central axis",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a worker uniform, a pale Asian young woman with long straight black hair, sits in the middle-left midground looking toward C08O13 at the bow, while the passage leading to the bow stretches across the middle-center background, leading to C08O13 in a dark jacket, an Asian middle-aged man with short black hair standing in the upper-center background. The camera is positioned at a seated-to-standing eye height, framing C01O01 at a three-quarter angle from the right with her torso angled down the shared deck they both occupy, her eyes fixed on the distant man. C08O13 appears with his back to the camera, maintaining a rigid, motionless posture like a statue, his feet firmly braced on the bow as he is gazing into the distance. The deep focus emphasizes the spatial tension and uninterrupted sightline along the deck passage, bounded by the bulwark and railing. Natural daytime light keeps both figures readable across the long depth, with restrained earthy neutral tones contrasting against the vibrant deep blue ocean visible beyond the vessel.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C08",
                "outlook_id": "O13"
              }
            ],
            "source_facts": [
              "뱃머리에는 산들이 지휘자처럼 홀로 서서 탁 트인 바다를 감상하듯 바라본다",
              "지후가 통로를 지나 멀찍이… 선수에 서 있는 산들의 뒷모습을 바라본다.",
              "그 역시 깊은 생각에 빠져있는 지 목석 같은 모습이다.",
              "화면 가득 푸르게 넘실대는 바다에 5톤 짜리 낚시 어선이 하얀 포말을 만들며 지나간다."
            ],
            "visual_inferences": [
              "fixed_element go_sandeul_bow_stance: A male figure stands rigidly at the very front tip of the boat's bow.",
              "fixed_element fishing_boat_sea_environment: A small 5-ton fishing boat navigates steadily across a vibrant, deep blue ocean.",
              "The narrow passage acts as a direct line of sight between the seated Ji-hoo and the standing San-deul."
            ],
            "creative_decisions": [
              "Positioned the camera at seated-to-standing eye height to geometrically validate the foreground seated figure and the distant standing figure.",
              "Used a deep depth of field to keep both characters in sharp focus across the long passage.",
              "Emphasized the earthy neutral tones of the deck and bulwark to make the vibrant blue sea pop out as a backdrop."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002",
              "fsc_003"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "anchor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bulwark",
                "usage_kind": "anchor",
                "source_phrase": "bounded by the bulwark and railing"
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cleat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "anchor",
                "source_phrase": "the shared deck they both occupy"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hatch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "anchor",
                "source_phrase": "bounded by the bulwark and railing"
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "winch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "47233a150ff82c70",
              "owned_hash": "a53298cc955f07fa",
              "camera_direction_hash": "c8878729bc7f4999",
              "owned_usage_hash": "29ff64d9843ce131",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bulwark",
                  "violating_phrase": "bounded by the bulwark and railing",
                  "reason": "The prompt references the bulwark purely as a spatial boundary of the deck, which matches the producer's anchor declaration with no redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "deck",
                  "violating_phrase": "the shared deck they both occupy",
                  "reason": "The prompt mentions the deck as the surface occupied by the characters to establish their spatial relationship, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "railing",
                  "violating_phrase": "bounded by the bulwark and railing",
                  "reason": "The prompt refers to the railing as a composition boundary to define the shot's perspective, which is a valid anchor reference with no redraw intent.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 17,
        "dependency_reason": "이전 샷(S17_Shot1)의 어선 및 바다 환경(fishing_boat_sea_environment)과 뱃머리에 선 고산들(go_sandeul_bow_stance)의 자세/위치를 일관되게 유지",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "C08",
          "L15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 17,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "End the tracking arc slightly behind and beside 김지후(강수리영) at seated-to-standing eye height, aligning the passage as a strong central axis toward the bow in a wide composition. Place 김지후(강수리영) seated in the near left midground with her face in three-quarter view, while 고산들 remains a smaller back-facing figure at the distant upper center, his feet braced at the bow within her uninterrupted sightline.",
            "lighting_mood": "Natural daytime light keeps both figures readable across the long depth of the passage, with restrained blue and earthy neutral tones separating them from the sea.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "passage leading to the bow",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "고산들 at the bow",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_left",
                  "target_id": "C01",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_003",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "고산들",
                  "screen_zone": "upper_center",
                  "target_id": "C08",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "C08",
              "L15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C08",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L14B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "anchor",
              "bollard",
              "bulwark",
              "cabin",
              "cleat",
              "deck",
              "door",
              "hatch",
              "navigation light",
              "railing",
              "rope",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "go_sandeul_bow_stance",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "A male figure stands rigidly at the very front tip of the boat's bow. He maintains an upright, motionless posture like a statue, with his feet firmly braced on the deck and his back turned to the main passenger area, gazing out at the distant ocean.",
                "applies_to_shots": [
                  1,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "뱃머리에는 산들이 지휘자처럼 홀로 서서 탁 트인 바다를 감상하듯 바라본다",
                  "목석 같은 모습이다",
                  "feet braced at the bow",
                  "back-facing figure at the distant upper center"
                ],
                "visual_inferences": [
                  "Even in the extreme wide exterior shot (Shot 1), his solitary silhouette is distinctly visible standing at the front tip of the boat."
                ],
                "creative_decisions": [
                  "Positioning his silhouette as a striking, stoic vertical line at the bow to emphasize his isolation and deep contemplation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "fishing_boat_sea_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A small 5-ton fishing boat navigates steadily across a vibrant, deep blue ocean, generating white foam in its wake. The surrounding environment is bright, illuminated by clear, natural daytime sunlight that sharply contrasts the boat against the vast expanse of the open water.",
                "applies_to_shots": [
                  1,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "화면 가득 푸르게 넘실대는 바다에 5톤 짜리 낚시 어선이 하얀 포말을 만들며 지나간다",
                  "Natural daytime light renders the blue sea and white foam clearly"
                ],
                "visual_inferences": [
                  "The deck of the boat is exposed to the bright natural sunlight, creating strong visibility along its passages from stern to bow."
                ],
                "creative_decisions": [
                  "Using a vivid color palette for the blue sea to contrast with the more neutral, earthy tones of the boat's deck and exterior."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 17,
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C08O13",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L14B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7327e6dc816a734f"
      },
      {
        "scene_index": 18,
        "heading": "19. 실내. 구형 산타페 SUV - 새벽(지후의 회상)",
        "beat_title": "사진 속 잔혹한 진실을 마주한 지후",
        "representative_moment": "지후가 구형 SUV 조수석에 앉아 고등학교 졸업 사진 액자를 내려다보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height observer perspective, static medium framing, blue-black dawn ambient",
            "t2i_prompt": "Photorealistic cinematic still. A seated chest-height observer perspective inside the front passenger area, angled slightly downward. C01O01 in a dark casual jacket, a Korean woman in her early 20s with a pretty oval face, long black straight hair, and a young pale appearance, occupies the right half of the frame at three-quarter angle from the right, torso and arms visible. She is hunched over, her eyes looking down at a framed photograph held in both hands. The photograph is kept below center and angled toward the camera; its surface shows an expressionless young Korean woman beside a broadly smiling middle-aged Korean woman. The front passenger seat back is visible behind her shoulders. The interior of the old SUV during early dawn is bathed in a low-key, blue-black ambient light without any distinct direct light sources, surrounded by aged, neutral cabin materials.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "구형 산타페 SUV - 새벽(지후의 회상)",
              "지후가 조수석에 앉아 사진 액자를 보고 있다.",
              "고등학교 졸업식 때 찍은 것 같은… 지후는 무표정인 반면, 민숙은 활짝 웃고 있는…"
            ],
            "visual_inferences": [
              "fixed_element suv_interior_dawn: low-key, blue-black ambient light, aged neutral interior",
              "torso and arms framed to match chest-height camera positioning"
            ],
            "creative_decisions": [
              "Placed Jihoo on the right half of the frame to emphasize the confined space.",
              "Applied reproduction surface rule to the photograph's content, replacing character IDs with generic demographic descriptors.",
              "Ensured the photograph is angled toward the camera to follow the DP's legibility constraint while maintaining her downward gaze."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cleat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f85951a8e8322a94",
              "owned_hash": "3629c8ae322e321c",
              "camera_direction_hash": "bf07edecedee4ebb",
              "owned_usage_hash": "a8a51bae0e67e4c8",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 1,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "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 seated chest height inside the front passenger area, hold a static medium frame angled slightly downward toward 김지후(강수리영) and the photograph in her hands. She occupies the right half of the frame, with the photograph kept below center and angled toward the lens so its image remains legible without exceeding a third of the composition.",
            "lighting_mood": "Low-key dawn ambience appropriate to the SUV interior carries restrained blue-black and aged-neutral grading without introducing a distinct visible source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L15B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench",
              "cleat",
              "deck",
              "door",
              "gate",
              "railing",
              "wheelhouse"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suv_interior_dawn",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of an old SUV during early dawn. The cabin is bathed in a low-key, blue-black ambient light without any distinct direct light sources. The seats and surrounding interior materials have an aged, neutral appearance reflecting the older vehicle model.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "구형 산타페 SUV - 새벽",
                  "Low-key dawn ambience appropriate to the SUV interior carries restrained blue-black and aged-neutral grading",
                  "within the remembered SUV interior"
                ],
                "visual_inferences": [
                  "The overall cabin lighting is consistently dim and atmospheric, matching the heavy mood of a dawn revelation."
                ],
                "creative_decisions": [
                  "Applied a consistent blue-black color grading across the interior shots to visually anchor the sequence in the remembered dawn setting."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L15B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "b60b40c57949d9eb"
      },
      {
        "scene_index": 18,
        "heading": "실내. 구형 산타페 SUV - 새벽(지후의 회상)",
        "beat_title": "지후가 필요한 이유를 묵직하게 전하는 산들",
        "representative_moment": "C08 looks firmly at the young woman in the passenger seat, delivering the heavy truth in the dim SUV.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Over-the-shoulder close framing at seated eye level, desaturated memory tone",
            "t2i_prompt": "Photorealistic cinematic still. Over-the-shoulder close framing at seated eye level inside a vehicle. The soft out-of-focus silhouette of a young Asian woman's shoulder and neck occupies the right foreground. Across the shared front row, C08O11 in a dark casual jacket, an Asian middle-aged man with a square jaw, occupies the center-left frame in three-quarter right profile, leaning toward the passenger side. His firm, unwavering expression is sharply focused, his eyes fixed steadily on the woman off-screen. The scene is rendered in a desaturated memory tone with soft, low-key blue-black dawn ambient light, creating restrained contrast. [: The aged, neutral material of the passenger seat edge angles into the lower foreground, while the dim driver's seat remains barely visible in the dark background behind the man.]",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "Sandeul is in the driver's seat, leaning across to Jihoo.",
              "Sandeul says '니가 있어야 우리가 사니까.' with a firm expression.",
              "Low-key dawn ambience inside the old SUV."
            ],
            "visual_inferences": [
              "fixed_element suv_interior_dawn: aged neutral materials and blue-black ambient light.",
              "Jihoo is only seen as an out-of-focus foreground shoulder due to the over-the-shoulder close framing.",
              "The desaturated lighting reflects the flashback/memory perception mode."
            ],
            "creative_decisions": [
              "Framed Sandeul in the center-left to create spatial tension across the vehicle cabin.",
              "Used shallow depth of field on the foreground shoulder to isolate Sandeul's unwavering expression."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cleat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b76616db26317313",
              "owned_hash": "3629c8ae322e321c",
              "camera_direction_hash": "6b3c4d721297a14c",
              "owned_usage_hash": "a8a51bae0e67e4c8",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": 18,
        "dependency_reason": "Same location (SUV interior) and dawn lighting as the previous moments in the flashback sequence.",
        "_shot_index": 5,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 18,
            "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 seated eye level beside the passenger side, hold close on 고산들 across 김지후(강수리영)'s soft foreground shoulder, aligning the lens with his gaze toward her. Sandeul's firm face occupies the center-left while Jihoo remains only as a restrained edge reference, making his final answer feel directed specifically at her.",
            "lighting_mood": "Low-key dawn ambience and restrained contrast isolate Sandeul's unwavering expression within the remembered SUV interior.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L15B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suv_interior_dawn",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of an old SUV during early dawn. The cabin is bathed in a low-key, blue-black ambient light without any distinct direct light sources. The seats and surrounding interior materials have an aged, neutral appearance reflecting the older vehicle model.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "구형 산타페 SUV - 새벽",
                  "Low-key dawn ambience appropriate to the SUV interior carries restrained blue-black and aged-neutral grading",
                  "within the remembered SUV interior"
                ],
                "visual_inferences": [
                  "The overall cabin lighting is consistently dim and atmospheric, matching the heavy mood of a dawn revelation."
                ],
                "creative_decisions": [
                  "Applied a consistent blue-black color grading across the interior shots to visually anchor the sequence in the remembered dawn setting."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "4eecf6ed1c88b626"
      },
      {
        "scene_index": 19,
        "heading": "20. 실외. 달리는 낚시 어선 - 낮",
        "beat_title": "낯선 자의 접근과 경고",
        "representative_moment": "친근한 미소를 띠고 바짝 다가온 낚시꾼을 굳은 표정으로 빤히 응시하는 지후.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "seated eye level tight two-shot, close framing",
            "t2i_prompt": "Photorealistic cinematic still. Observed from seated eye level, C01O01 in a casual outfit, a young Korean woman with long black hair and a pale complexion, occupies the right-center of the frame in three-quarter left profile, waist-up visible. She remains seated rigidly with her shoulders drawn back on the shared passenger seat, her eyes fixed on the man. A Korean middle-aged man in a pristine new fisher uniform leans in close from the left edge in three-quarter right profile, occupying the same seat, his eyes fixed on the young woman. Due to the tight close framing, the man's smiling face is rendered in partial soft focus while C01O01's stiff expression remains sharply detailed. [: The narrow boat passage recedes diagonally behind them and the seat fronts cross the lower frame edge, washed in stark natural daytime sunlight that creates firm facial contrast against restrained earthy neutrals].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "지후는 여전히 혼란스런 표정.",
              "그때 옆으로 슬쩍 엉덩이를 붙여 앉는 낚싯꾼, 김여상(45).",
              "금방 사 입은 것처럼 티끌 하나 없는 아래, 위 새삥 낚시복장이 오히려 어색해 보이는…",
              "(친근하게 웃으며) 금월도 사람이예요?",
              "(빤히 쳐다보기만)…"
            ],
            "visual_inferences": [
              "fixed_element jihoo_seated_posture: rigid and alert seated position on the passenger area",
              "fixed_element daytime_sea_lighting: bright natural sunlight hitting the deck",
              "close framing rules applied: Yeosang rendered in partial soft focus to emphasize C01's sharp, rigid expression"
            ],
            "creative_decisions": [
              "Positioned the camera at seated eye level to anchor both characters in the confined space and heighten the tension of the intrusion.",
              "Used stark natural daytime sunlight to cast firm facial contrast, ironically juxtaposing the bright day with the tense interaction."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "antenna",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bucket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "canopy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cleat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooler",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing rod",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life jacket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lifebuoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rod holder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tackle box",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "dba497597341a10c",
              "owned_hash": "3157b7b7c43eec01",
              "camera_direction_hash": "829a473450966cd1",
              "owned_usage_hash": "0db4e09d3087c3da",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 16,
        "dependency_reason": "동일한 낚시 어선의 공간과 밝은 낮 시간대의 조명 분위기를 연속적으로 유지",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At seated eye level beside the boat passage, finish the dolly-in in a tight three-quarter two-shot, preserving 김여상's smiling face close to 김지후(강수리영) while favoring Jihoo's fixed expression. Jihoo holds the right-center of frame and Yeo-sang leans in from the left, with peripheral boat activity retained only at the edges.",
            "lighting_mood": "Natural daytime illumination appropriate to the open boat is graded with restrained earthy neutrals and firm facial contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L13B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "jihoo_seated_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young woman, Kim Jihoo, remains seated on the passenger area of the moving fishing boat. Her posture is rigid and alert, keeping her physical level lower than the other characters who approach her in the confined space of the boat deck.",
                "applies_to_shots": [
                  2,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "지후는 여전히 혼란스런 표정. 그때 옆으로 슬쩍 엉덩이를 붙여 앉는 낚싯꾼",
                  "Shot 2: seated beside the boat passage, shoulders drawn rigidly back.",
                  "Shot 7: seated with chin raised, lower-right in the foreground."
                ],
                "visual_inferences": [
                  "Her continuous seated position underscores a defensive and trapped feeling as different men approach her with warnings."
                ],
                "creative_decisions": [
                  "Keeping Jihoo physically anchored in her seat to emphasize the looming presence of the standing or leaning characters interacting with her."
                ],
                "confidence": "high"
              },
              {
                "element_id": "daytime_sea_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is characterized by bright, natural daytime sunlight. The clear weather provides a consistent, stark illumination that reflects off the open blue sea and lights up the deck of the fishing boat.",
                "applies_to_shots": [
                  2,
                  7,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 달리는 낚시 어선 - 낮",
                  "Shot 2: Natural daytime illumination appropriate to the open boat.",
                  "Shot 7: Natural daytime illumination keeps the boat setting clear.",
                  "Shot 12: Bright daytime sunlight glitters across the blue waves."
                ],
                "visual_inferences": [
                  "The bright and clear daytime weather creates an ironically peaceful backdrop that contrasts with the tense warnings and the uncanny isolation of the island."
                ],
                "creative_decisions": [
                  "Utilizing harsh, natural sunlight to heighten facial contrasts during tense conversations and to emphasize the vast emptiness of the ocean around the boat."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "3b06610a6d515c13"
      },
      {
        "scene_index": 19,
        "heading": "20. 실외. 달리는 낚시 어선 - 낮",
        "beat_title": "마지막 경고와 단호한 결심",
        "representative_moment": "고산들(C08)이 갑판에 앉아 있는 젊은 여성을 무거운 눈빛으로 내려다보고, 여성은 흔들림 없이 그를 올려다보며 마주한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide shot from a subtly low waist-height perspective, stark daylight contrast",
            "t2i_prompt": "Photorealistic cinematic still. C08O11 in dark casual clothes, an Asian middle-aged man, stands in the middle-center midground, and the shared boat passage extends into the upper-center background. The man stands in full figure at three-quarter angle from the left, his weight set forward before a young Asian woman in her 20s seated in the lower-right foreground. She sits rigidly at three-quarter angle from the right, her chin raised and eyes fixed on the man, occupying the same deck passage. The man's eyes are fixed down on her, creating a tense confrontation axis. Harsh, natural daytime sunlight reflects off the open blue sea visible over the railing, casting stark shadows on the boat cabin. Captured from a subtly low observer perspective at waist height, emphasizing the man's looming presence against the bright maritime setting.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "Shot 7: seated with chin raised, lower-right in the foreground.",
              "Sandeul occupies the middle-center in full figure while Jihoo remains lower-right in the foreground.",
              "Natural daytime illumination keeps the boat setting clear while controlled contrast gives the exchange a sober, threatening weight."
            ],
            "visual_inferences": [
              "fixed_element jihoo_seated_posture: her continuous seated position underscores a defensive and trapped feeling",
              "fixed_element daytime_sea_lighting: bright daylight creates stark illumination reflecting off the sea"
            ],
            "creative_decisions": [
              "Employed a subtly low waist-height camera angle to geometrically anchor the seated figure in the foreground while maintaining the standing figure's full vertical presence in the midground.",
              "Used harsh daylight shadows on the cabin to heighten the tension of the conversation against an ironically bright backdrop."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "antenna",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bucket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "anchor",
                "source_phrase": "on the boat cabin"
              },
              {
                "owned_token": "canopy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cleat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooler",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "anchor",
                "source_phrase": "occupying the same deck passage"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing rod",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life jacket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lifebuoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "anchor",
                "source_phrase": "over the railing"
              },
              {
                "owned_token": "rod holder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tackle box",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "eedd0cc920114f64",
              "owned_hash": "3157b7b7c43eec01",
              "camera_direction_hash": "3327a238d9b84ff9",
              "owned_usage_hash": "65b37d7460125f4f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "cabin",
                  "violating_phrase": "casting stark shadows on the boat cabin",
                  "reason": "The prompt references the cabin only to describe how sunlight casts shadows on it, serving as a lighting and spatial anchor without any redraw instruction, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "deck",
                  "violating_phrase": "occupying the same deck passage",
                  "reason": "The prompt mentions the deck passage purely as a spatial reference for positioning the characters, with no instruction to redraw or modify it, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "railing",
                  "violating_phrase": "visible over the railing",
                  "reason": "The prompt uses the railing as a compositional boundary to describe the background sea, with no intention to redraw or modify the railing, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 19,
        "dependency_reason": "이전 샷(Shot 2)의 낚시 어선 갑판 공간 및 주간 채광 상태 유지 (exact_background)",
        "_shot_index": 7,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track laterally at standing waist height until 고산들 is fully visible in front of the seated 김지후(강수리영), using a subtly low perspective from her level to intensify his warning. Sandeul occupies the middle-center in full figure while Jihoo remains lower-right in the foreground, their shared deck passage preserving the confrontation axis.",
            "lighting_mood": "Natural daytime illumination keeps the boat setting clear while controlled contrast gives the exchange a sober, threatening weight.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "shared boat passage",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "고산들",
                  "screen_zone": "middle_center",
                  "target_id": "C08",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L13B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "antenna",
              "bench",
              "bollard",
              "bucket",
              "cabin",
              "canopy",
              "cleat",
              "cooler",
              "deck",
              "door",
              "fishing rod",
              "life jacket",
              "lifebuoy",
              "navigation light",
              "net",
              "railing",
              "rod holder",
              "rope",
              "tackle box",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "jihoo_seated_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young woman, Kim Jihoo, remains seated on the passenger area of the moving fishing boat. Her posture is rigid and alert, keeping her physical level lower than the other characters who approach her in the confined space of the boat deck.",
                "applies_to_shots": [
                  2,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "지후는 여전히 혼란스런 표정. 그때 옆으로 슬쩍 엉덩이를 붙여 앉는 낚싯꾼",
                  "Shot 2: seated beside the boat passage, shoulders drawn rigidly back.",
                  "Shot 7: seated with chin raised, lower-right in the foreground."
                ],
                "visual_inferences": [
                  "Her continuous seated position underscores a defensive and trapped feeling as different men approach her with warnings."
                ],
                "creative_decisions": [
                  "Keeping Jihoo physically anchored in her seat to emphasize the looming presence of the standing or leaning characters interacting with her."
                ],
                "confidence": "high"
              },
              {
                "element_id": "daytime_sea_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is characterized by bright, natural daytime sunlight. The clear weather provides a consistent, stark illumination that reflects off the open blue sea and lights up the deck of the fishing boat.",
                "applies_to_shots": [
                  2,
                  7,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 달리는 낚시 어선 - 낮",
                  "Shot 2: Natural daytime illumination appropriate to the open boat.",
                  "Shot 7: Natural daytime illumination keeps the boat setting clear.",
                  "Shot 12: Bright daytime sunlight glitters across the blue waves."
                ],
                "visual_inferences": [
                  "The bright and clear daytime weather creates an ironically peaceful backdrop that contrasts with the tense warnings and the uncanny isolation of the island."
                ],
                "creative_decisions": [
                  "Utilizing harsh, natural sunlight to heighten facial contrasts during tense conversations and to emphasize the vast emptiness of the ocean around the boat."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 19,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L13B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "0aa4727b2837e4ef"
      },
      {
        "scene_index": 19,
        "heading": "20. 실외. 달리는 낚시 어선 - 낮",
        "beat_title": "홀로 떠 있는 금월도의 압도적인 전경",
        "representative_moment": "주변 섬들이 모두 사라진 바다 위에 홀로 아름답게 떠 있는 금월도의 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static very wide view at standing eye height, bright daytime sunlight",
            "t2i_prompt": "Photorealistic cinematic still. The lone island sits in the middle-center background. From a standing eye-level forward sightline on a boat, a static very wide view aimed level toward the uninterrupted horizon captures the distant landmass. The island stands completely isolated, surrounded on every side by the open sea with no other landmasses interrupting the composition. Bright daytime sunlight glitters across the blue waves, lending the distant cliff, dense forest, and small village an alluring clarity edged with an uncanny stillness under the scattered clouds.",
            "outfit_assignments": [],
            "source_facts": [
              "주변 곳곳에 보이던 섬들은 전부 사라지고, 햇살에 반짝이는 물결 위에는 오직 하나의 섬만 덩그라니 떠 있다.",
              "마치 이 세상 어느 곳도 아닌 것처럼, 유토피아 같이 아름다운 풍광의 섬: 금월도."
            ],
            "visual_inferences": [
              "fixed_element daytime_sea_lighting: bright, natural daytime sunlight",
              "lone island visible alone with all surrounding islands absent"
            ],
            "creative_decisions": [
              "Uninterrupted horizon to emphasize the eerie isolation of the island",
              "Bright and clear sunlight contrasting with the uncanny stillness to create psychological suspense"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cliff",
                "usage_kind": "anchor",
                "source_phrase": "distant cliff"
              },
              {
                "owned_token": "cloud",
                "usage_kind": "anchor",
                "source_phrase": "scattered clouds"
              },
              {
                "owned_token": "forest",
                "usage_kind": "anchor",
                "source_phrase": "dense forest"
              },
              {
                "owned_token": "harbor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "island",
                "usage_kind": "anchor",
                "source_phrase": "The lone island sits in the middle-center background"
              },
              {
                "owned_token": "sea",
                "usage_kind": "anchor",
                "source_phrase": "surrounded on every side by the open sea"
              },
              {
                "owned_token": "village",
                "usage_kind": "anchor",
                "source_phrase": "small village"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "229b4cb279a1c2aa",
              "owned_hash": "7ff7e29d541c9397",
              "camera_direction_hash": "a69ce4462cefaa10",
              "owned_usage_hash": "a782453e8dc84ea1",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "cliff",
                  "violating_phrase": "distant cliff",
                  "reason": "The prompt references the distant cliff as part of the existing island landscape with no instructions to redraw or recreate it, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "cloud",
                  "violating_phrase": "scattered clouds",
                  "reason": "The prompt mentions scattered clouds as part of the existing sky background, which is consistent with the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "forest",
                  "violating_phrase": "dense forest",
                  "reason": "The prompt mentions the dense forest on the island to describe the lighting/clarity, without modifying or adding new forest elements, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "island",
                  "violating_phrase": "The lone island sits in the middle-center background",
                  "reason": "The island is referenced as a compositional anchor to define the camera angle and framing, which matches the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sea",
                  "violating_phrase": "surrounded on every side by the open sea",
                  "reason": "The open sea is described to establish the environment and composition, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "village",
                  "violating_phrase": "small village",
                  "reason": "The small village on the island is mentioned to describe the sunlight's clarity on existing features, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 12,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 19,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the boat's forward sightline at standing eye height, hold a static very wide view aimed level toward the horizon. 금월도 sits alone in the central distance with open water surrounding it on every side and no other island shapes interrupting the composition.",
            "lighting_mood": "Bright daytime sunlight glitters across the blue waves, lending the isolated island an alluring clarity edged with uncanny stillness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "lone island of 금월도",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L13B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cliff",
              "cloud",
              "forest",
              "harbor",
              "island",
              "sea",
              "village"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_sea_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is characterized by bright, natural daytime sunlight. The clear weather provides a consistent, stark illumination that reflects off the open blue sea and lights up the deck of the fishing boat.",
                "applies_to_shots": [
                  2,
                  7,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 달리는 낚시 어선 - 낮",
                  "Shot 2: Natural daytime illumination appropriate to the open boat.",
                  "Shot 7: Natural daytime illumination keeps the boat setting clear.",
                  "Shot 12: Bright daytime sunlight glitters across the blue waves."
                ],
                "visual_inferences": [
                  "The bright and clear daytime weather creates an ironically peaceful backdrop that contrasts with the tense warnings and the uncanny isolation of the island."
                ],
                "creative_decisions": [
                  "Utilizing harsh, natural sunlight to heighten facial contrasts during tense conversations and to emphasize the vast emptiness of the ocean around the boat."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 16,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L13B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "9a46f1830ceceafb"
      },
      {
        "scene_index": 20,
        "heading": "21. 실외. 금월도 선착장 - 낮",
        "beat_title": "Overwhelmed by the Crowd",
        "representative_moment": "Jihoo hunches her shoulders in bewilderment as the excessive welcome crowd presses in around her.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Face-dominant close-up with shallow depth of field from shoulder height.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual outfit, a young Korean woman with a pale oval face and long black hair, isolated within the welcome crowd in the middle-center midground. Framed in a face-dominant close-up from shoulder height, she is seen at a three-quarter left angle with her shoulders hunched at the bottom of the frame. Her unsettled eyes look off-screen, searching anxiously beyond the lens. Bright natural daytime illumination casts high facial contrast on her features, emphasizing her discomfort. The immediate surroundings are [: soft, out-of-focus shoulders and clapping hands of the restless villagers pressing in from both frame edges, with no other faces or distinct background elements visible].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "과도한 환영 인파에 위축된 김지후가 어깨를 웅크린 채 당황한 눈빛으로 주변을 살피는 얼굴",
              "The outdoor pier environment is brightly illuminated by natural daytime sunlight."
            ],
            "visual_inferences": [
              "To maintain the close-up constraint and face-dominant framing, the crowd is rendered only as soft, partial body parts at the frame edges without distinct faces."
            ],
            "creative_decisions": [
              "Used high facial contrast on Jihoo despite the bright daylight to visually expose her internal discomfort against the public celebration."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "barricade",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "garland",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warning sign",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6d6322629283cc9b",
              "owned_hash": "e792fcf5db191d8e",
              "camera_direction_hash": "28d2d6f9d6873cf0",
              "owned_usage_hash": "b8c465408462a442",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 18,
        "dependency_reason": "Background location established in scene 18, though skipped in this specific shot due to close framing scale.",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "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": "From shoulder height at the outer edge of the villagers, complete the dolly-in on a face-dominant frame of 김지후(강수리영) seen through restless bodies at both edges. Her hunched shoulders remain at the bottom of frame while her unsettled eyes search beyond the lens, and no other face intrudes into the central area.",
            "lighting_mood": "Natural daytime illumination preserves the public brightness of the welcome while high facial contrast makes Jihoo's discomfort feel exposed.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김지후(강수리영) isolated within the welcome crowd",
                  "screen_zone": "middle_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L15B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_natural_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor pier environment is brightly illuminated by natural daytime sunlight. The consistent daylight provides clear visibility across the open area.",
                "applies_to_shots": [
                  5,
                  8,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 선착장 - 낮",
                  "Natural daytime illumination"
                ],
                "visual_inferences": [
                  "The lighting creates natural outdoor shadows and maintains a bright, open atmosphere without heavy artificial tinting."
                ],
                "creative_decisions": [
                  "Ensured the daytime lighting remains consistent across all framing angles on the pier to ground the scene's reality."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 18,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "d9f534a7d5b1c457"
      },
      {
        "scene_index": 20,
        "heading": "실외. 금월도 선착장 - 낮",
        "beat_title": "환대하며 다가오는 외할머니 영란",
        "representative_moment": "흰 머리의 강영란이 선착장 끝에 꼿꼿하게 서서, 다가오는 지후를 향해 온화한 미소를 짓고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height wide shot on the approach axis, natural daytime illumination with muted cinematic grading",
            "t2i_prompt": "Photorealistic cinematic still. Shot from chest height on the established approach axis. An Asian elderly woman in her late sixties with prominently white hair, wearing a neat and modest outfit, stands at the end of the pier occupying the middle-center of the wide frame. She is positioned at three-quarter angle from the right, her feet planted firmly on the wooden surface. Her eyes are fixed on an approaching figure off-screen, a gentle smile warming her elegant face. The pier walkway faces the camera along its length, converging behind her position. In the distant background, small houses with colorful roofs sit among autumn trees and forest. A docked fishing boat and a wooden bollard are visible along the edge. The scene is brightly illuminated by natural daytime sunlight, casting soft outdoor shadows with an open warmth, tempered by muted color grading and restrained contrast.",
            "outfit_assignments": [],
            "source_facts": [
              "60 후반 노인, 온화한 인상에 고운 자태, 강영란(흰 머리 여자)",
              "선착장 끝에 서 있는",
              "알록달록 한 지붕의 소담스런 집들이 단풍이 한창인 나무, 숲과 어우러져"
            ],
            "visual_inferences": [
              "fixed_element pier_natural_daylight: natural daytime sunlight provides clear visibility without heavy artificial tinting",
              "fixed_element youngran_white_hair_appearance: elegant and neat physical presence, prominently white hair",
              "the pier walkway converges behind her to establish the spatial approach axis"
            ],
            "creative_decisions": [
              "wide framing at chest height to capture her full upright bearing and the distant village context",
              "muted color grading applied to the daytime warmth to maintain the project's folk-occult thriller visual tone"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "barricade",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "anchor",
                "source_phrase": "wooden bollard"
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "anchor",
                "source_phrase": "docked fishing boat"
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "garland",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "stands at the end of the pier"
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warning sign",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e2c361ace5f86787",
              "owned_hash": "e792fcf5db191d8e",
              "camera_direction_hash": "7b0c689e1a03bd40",
              "owned_usage_hash": "5f25342280580074",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "pier",
                  "violating_phrase": "stands at the end of the pier",
                  "reason": "The pier is mentioned to position the character and describe the camera angle without any instructions to alter, redraw, or recreate its structure.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fishing boat",
                  "violating_phrase": "docked fishing boat",
                  "reason": "The fishing boat is referenced as a passive background element to establish the scene layout, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bollard",
                  "violating_phrase": "wooden bollard",
                  "reason": "The bollard is mentioned as a static environmental element visible along the edge, acting as a background anchor without any redraw instruction.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "동일 씬 앞선 샷(Shot 5)의 선착장 배경 구조와 주간 자연광 조명의 연속성 유지",
        "_shot_index": 8,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height on the established approach axis, briefly suspend the track in a medium-full view of 강영란(흰 머리 여자) at the end of the pier. She occupies the middle-center with her full upright bearing visible, her gentle smile aimed along Jihoo's approaching path rather than directly into the lens.",
            "lighting_mood": "Natural daytime illumination gives Youngran's welcome an open warmth, tempered by restrained contrast and muted color grading.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L15B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "banner",
              "barricade",
              "bollard",
              "crate",
              "fishing boat",
              "fishing net",
              "flag",
              "gangway",
              "garland",
              "lamp",
              "pier",
              "railing",
              "rope",
              "shed",
              "tire",
              "warning sign"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_natural_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor pier environment is brightly illuminated by natural daytime sunlight. The consistent daylight provides clear visibility across the open area.",
                "applies_to_shots": [
                  5,
                  8,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 선착장 - 낮",
                  "Natural daytime illumination"
                ],
                "visual_inferences": [
                  "The lighting creates natural outdoor shadows and maintains a bright, open atmosphere without heavy artificial tinting."
                ],
                "creative_decisions": [
                  "Ensured the daytime lighting remains consistent across all framing angles on the pier to ground the scene's reality."
                ],
                "confidence": "high"
              },
              {
                "element_id": "youngran_white_hair_appearance",
                "element_type": "character_state",
                "character_name": "강영란(흰 머리 여자)",
                "description": "An elderly woman in her late sixties with prominently white hair. She maintains an elegant and neat physical presence.",
                "applies_to_shots": [
                  8,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "60 후반 노인",
                  "온화한 인상에 고운 자태",
                  "강영란(흰 머리 여자)"
                ],
                "visual_inferences": [
                  "Her white hair is neatly kept, complementing her graceful and dignified bearing."
                ],
                "creative_decisions": [
                  "Focused on her distinct age and white hair as fixed visual anchors across her varying actions."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L15B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "950d00387bb1548c"
      },
      {
        "scene_index": 20,
        "heading": "실외. 금월도 선착장 - 낮",
        "beat_title": "영란과의 첫 대면과 낯선 환대",
        "representative_moment": "금월도 선착장에서 영란이 굳어 있는 지후(C01)를 꽉 끌어안고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height medium two-shot with natural daytime daylight and restrained contrast.",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from chest height beside the pair, torso and arms in frame with lower legs implied beyond the bottom edge. Occupying the left half in right profile, an Asian elderly woman in her late sixties with prominently white hair and an elegant appearance has both arms locked around the younger woman, looking down. Compressed into the right half in left profile, C01O01 in a casual jacket, a pale Asian young woman, is held stiffly in the embrace, her eyes fixed past the older woman toward a departing figure off-screen. They stand in the same outdoor pier environment established previously, brightly illuminated by natural daytime sunlight. The side edge of the wooden pier recedes behind their joined shoulders, while a soft background of welcoming villagers gathers further back on the walkway. Restrained daylight contrast highlights the tension between the warm embrace and the rigid posture.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Shot description: Kang Youngran occupies the left half with both arms locked around Jihoo, while Jihoo is compressed into the right half and turns her eyes past Youngran toward the departing Sandeul.",
              "Scene text: Youngran embraces Jihoo warmly, welcoming villagers are gathered behind."
            ],
            "visual_inferences": [
              "fixed_element: youngran_white_hair_appearance ensures she is depicted as an elderly woman with prominently white hair.",
              "fixed_element: pier_natural_daylight confirms bright daylight illuminating the scene.",
              "Camera positioning at chest height naturally frames the torso and arms, implying the rest of the body beyond the frame edges."
            ],
            "creative_decisions": [
              "Restrained daylight contrast used to highlight the physical tension of Jihoo being stiffly held within Youngran's warm embrace.",
              "Placed the welcoming villagers in the soft background to maintain the narrative focus on the intimate two-shot while still providing environmental context."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "barricade",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "garland",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "The side edge of the wooden pier recedes behind their joined shoulders"
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warning sign",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5239d31ee28d0c49",
              "owned_hash": "e792fcf5db191d8e",
              "camera_direction_hash": "fd0a3c90d0bf25e0",
              "owned_usage_hash": "ba907224a021157e",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "pier",
                  "violating_phrase": "The side edge of the wooden pier recedes behind their joined shoulders",
                  "reason": "The wooden pier is mentioned purely as a spatial and compositional anchor to establish the setting and background depth, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "Same room exact background consistency from previous shot (S20_Shot5) requires maintaining the pier environment.",
        "_shot_index": 11,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 20,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height beside the pair, hold a static perpendicular two-shot tightened around their joined upper bodies. 강영란(흰 머리 여자) occupies the left half with both arms locked around 김지후(강수리영), while Jihoo is compressed into the right half and turns her eyes past Youngran toward the departing Sandeul.",
            "lighting_mood": "Natural daytime illumination presents the embrace clearly, while restrained contrast preserves the tension between Youngran's warmth and Jihoo's rigidity.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L15B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "banner",
              "barricade",
              "bollard",
              "crate",
              "fishing boat",
              "fishing net",
              "flag",
              "gangway",
              "garland",
              "lamp",
              "pier",
              "railing",
              "rope",
              "shed",
              "tire",
              "warning sign"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_natural_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor pier environment is brightly illuminated by natural daytime sunlight. The consistent daylight provides clear visibility across the open area.",
                "applies_to_shots": [
                  5,
                  8,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 선착장 - 낮",
                  "Natural daytime illumination"
                ],
                "visual_inferences": [
                  "The lighting creates natural outdoor shadows and maintains a bright, open atmosphere without heavy artificial tinting."
                ],
                "creative_decisions": [
                  "Ensured the daytime lighting remains consistent across all framing angles on the pier to ground the scene's reality."
                ],
                "confidence": "high"
              },
              {
                "element_id": "youngran_white_hair_appearance",
                "element_type": "character_state",
                "character_name": "강영란(흰 머리 여자)",
                "description": "An elderly woman in her late sixties with prominently white hair. She maintains an elegant and neat physical presence.",
                "applies_to_shots": [
                  8,
                  11
                ],
                "element_scope": "full",
                "source_facts": [
                  "60 후반 노인",
                  "온화한 인상에 고운 자태",
                  "강영란(흰 머리 여자)"
                ],
                "visual_inferences": [
                  "Her white hair is neatly kept, complementing her graceful and dignified bearing."
                ],
                "creative_decisions": [
                  "Focused on her distinct age and white hair as fixed visual anchors across her varying actions."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L15B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "6902b6305e0105cc"
      },
      {
        "scene_index": 21,
        "heading": "22. 실내. 반월 식당 - 낮",
        "beat_title": "할머니와 옛 사진을 들여다보는 지후",
        "representative_moment": "식당 테이블에 나란히 앉은 C06이 옛 사진첩을 짚으며 설명하고, C01은 고개를 숙여 사진첩을 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At seated eye level beside the table, medium framing, soft depth of field for the background",
            "t2i_prompt": "Photorealistic cinematic still. Captured at seated eye level beside a shared sturdy dining table, the near edge of the table crosses the lower frame and recedes toward the background. C06O07 in a modernized hanbok, an elderly Korean woman, sits at a three-quarter angle from the right, her torso leaning close with one finger directed downward at an open old photo album. C01O01 in casual wear, a young Korean woman in her 20s, sits beside her at a three-quarter angle from the left, her upper body angled over the table. Both figures keep their eyes cast downward, fixed on the album. The open photo album rests flat on the table, its image-bearing pages facing upward and partly toward the camera, displaying photographs of a young woman and a baby. The mixed restaurant-store interior is held in soft depth behind them, revealing shelves lined with everyday groceries and fishing gear. Daytime ambient light fills the space with restrained contrast and an aged neutral color palette, highlighting the intimate exchange.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O07"
              },
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "영란은 테이블에 앉은 손녀 지후 옆에 찰싹 달라붙어 오래된 사진첩을 보여준다.",
              "한장… 한장… 민숙의 어린 시절, 그리고 지후의 갓난 아기적 사진까지…",
              "Daytime ambient light appropriate to the interior is shaped with restrained contrast and aged neutral color",
              "The open image-bearing pages face upward and partly toward the camera, displaying photographs of young Minsook and Jihoo as a baby."
            ],
            "visual_inferences": [
              "fixed_element dining_table anchors the two seated figures in the foreground",
              "fixed_element multipurpose_store_interior provides a cluttered background of groceries and fishing gear",
              "Both characters maintain a downward gaze toward the shared photo album on the table"
            ],
            "creative_decisions": [
              "Medium framing from a seated eye level to include the upper bodies, the shared table, and the album without resorting to body-part close-ups",
              "Soft depth of field applied to the background to keep the focus on the intimate interaction between the two figures and the album"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "94939e36ada87603",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d12177fef9fd0152",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C06",
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At seated eye level beside the table, continue the gentle dolly-in but stop slightly wider than the stage endpoint so 강영란(흰 머리 여자), 김지후(강수리영), and the open album remain readable together. Youngran presses close on the left and points into the album at lower center, while Jihoo leans in from the right with the mixed restaurant-store interior held in soft depth behind them.",
            "lighting_mood": "Daytime ambient light appropriate to the interior is shaped with restrained contrast and aged neutral color, keeping the album exchange intimate rather than nostalgic.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "C01"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C06",
                "outlook_id": "O07"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "multipurpose_store_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cluttered interior of the island establishment, functioning as a combined diner, convenience store, and fishing tackle shop. The space is filled with earthy daytime ambient lighting that maintains a firm contrast and a restrained, neutral palette. Various goods and kitchen elements occupy the background, establishing the multipurpose nature of the small shop.",
                "applies_to_shots": [
                  2,
                  10,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "초등학교 교실 정도 크기에 식당과 편의점, 낚시 용품점 등을 총 망라한 잡화점",
                  "mixed restaurant-store interior held in soft depth",
                  "table and kitchen behind providing natural scale",
                  "Daytime ambient light appropriate to the interior is shaped with restrained contrast and aged neutral color",
                  "restrained earthy palette"
                ],
                "visual_inferences": [
                  "The walls and shelves are lined with a dense mix of everyday groceries and fishing gear, reflecting the remote island setting."
                ],
                "creative_decisions": [
                  "The background elements are kept in soft focus during tighter shots to maintain emphasis on the subjects while preserving the authentic, slightly claustrophobic atmosphere of the shop."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dining_table",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A sturdy dining table situated in the center of the restaurant area. It serves as the physical anchor for the scene, providing a surface for the photo album and later supporting the heavy trays of raw meat.",
                "applies_to_shots": [
                  2,
                  10,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "테이블에 앉은 손녀 지후",
                  "식당 테이블에 나란히 앉은",
                  "쟁반을 테이블 위로 반쯤 내려놓은",
                  "the table remain soft at the edges"
                ],
                "visual_inferences": [
                  "The table is made of a worn, practical material like wood or rustic laminate, suitable for an old countryside diner."
                ],
                "creative_decisions": [
                  "Positioned consistently across shots to ground the spatial relationship between the characters sitting at it, the server approaching it, and the children feasting on it."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C06O07",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "98b96e7978bb3b7d"
      },
      {
        "scene_index": 21,
        "heading": "22. 실내. 반월 식당 - 낮",
        "beat_title": "불쾌한 핏빛 상차림",
        "representative_moment": "C08이 선홍빛 생고기가 가득한 쟁반을 식당 테이블 위로 반쯤 내려놓는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium dolly-in shot from table height",
            "t2i_prompt": "Photorealistic cinematic still. Shot from table height on the kitchen-facing side. C08O11 in dark casual clothes, an East Asian middle-aged man, occupies the upper-left frame, bent forward at a three-quarter angle from the left. He is lowering a large serving tray halfway down over a sturdy dining table, his gaze directed down at the food. The dining table crosses the lower frame. The tray, angled with its front edge toward the camera, occupies the lower center at less than a third of the frame, loaded with vivid bright-red raw meat dishes. The cluttered multipurpose store interior extends into the soft background, lined with shelves of groceries and kitchen elements. Daytime ambient light shapes the room with firm contrast, allowing the intense red of the raw meat to puncture the restrained, earthy neutral palette.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "산들이 준비된 식사를 내어온다",
              "테이블이 넘칠 듯 푸짐한 한 상: 육고기 그득한 된장찌개와 도시에서도 보기 힘든 육회",
              "여전히 선홍빛 핏기를 머금은 생고기들이 그 신선함을 뽐낸다",
              "mixed restaurant-store interior held in soft depth"
            ],
            "visual_inferences": [
              "fixed_element dining_table anchors the scene in the lower frame",
              "bent lowering loaded tray at table height"
            ],
            "creative_decisions": [
              "composition places the character's torso in the upper left and the meat tray in the lower center to emphasize the raw food",
              "firm lighting contrast isolates the vivid red meat against the otherwise muted, earthy background"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "47d3b333a5f8b1cb",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "0448f8c33728af68",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "식당 내부 테이블과 배경 공간의 물리적 연속성 유지",
        "_shot_index": 10,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At table height on the kitchen-facing side, pause the dolly-in as 고산들 holds the loaded tray halfway down over the tabletop. His bent torso occupies the upper-left, while the tray and vivid raw dishes remain in the lower center at less than a third of the frame, with the table and kitchen behind providing natural scale.",
            "lighting_mood": "Daytime ambient interior light is held in firm contrast, allowing the vivid red of the raw meat to puncture the otherwise restrained earthy palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "multipurpose_store_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cluttered interior of the island establishment, functioning as a combined diner, convenience store, and fishing tackle shop. The space is filled with earthy daytime ambient lighting that maintains a firm contrast and a restrained, neutral palette. Various goods and kitchen elements occupy the background, establishing the multipurpose nature of the small shop.",
                "applies_to_shots": [
                  2,
                  10,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "초등학교 교실 정도 크기에 식당과 편의점, 낚시 용품점 등을 총 망라한 잡화점",
                  "mixed restaurant-store interior held in soft depth",
                  "table and kitchen behind providing natural scale",
                  "Daytime ambient light appropriate to the interior is shaped with restrained contrast and aged neutral color",
                  "restrained earthy palette"
                ],
                "visual_inferences": [
                  "The walls and shelves are lined with a dense mix of everyday groceries and fishing gear, reflecting the remote island setting."
                ],
                "creative_decisions": [
                  "The background elements are kept in soft focus during tighter shots to maintain emphasis on the subjects while preserving the authentic, slightly claustrophobic atmosphere of the shop."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dining_table",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A sturdy dining table situated in the center of the restaurant area. It serves as the physical anchor for the scene, providing a surface for the photo album and later supporting the heavy trays of raw meat.",
                "applies_to_shots": [
                  2,
                  10,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "테이블에 앉은 손녀 지후",
                  "식당 테이블에 나란히 앉은",
                  "쟁반을 테이블 위로 반쯤 내려놓은",
                  "the table remain soft at the edges"
                ],
                "visual_inferences": [
                  "The table is made of a worn, practical material like wood or rustic laminate, suitable for an old countryside diner."
                ],
                "creative_decisions": [
                  "Positioned consistently across shots to ground the spatial relationship between the characters sitting at it, the server approaching it, and the children feasting on it."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "e5bba530177167d6"
      },
      {
        "scene_index": 21,
        "heading": "실내. 반월 식당 - 낮",
        "beat_title": "기괴한 식사 모습",
        "representative_moment": "입가에 붉은 피를 묻힌 채 고개를 뒤로 젖히고 맨손으로 날고기를 뜯어먹는 금월도 꼬마 아이의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight close-up at seated head height, shallow depth of field isolating the central subject, high-contrast daytime ambient lighting",
            "t2i_prompt": "Photorealistic cinematic still. C23O25 in an oversized rural shirt, an East Asian child, at three-quarter angle from the left, occupies most of the center-right frame. The child's head is thrown back, looking up, with hands violently pulling raw, dark red meat apart just beneath the chin, heavy blood smeared thickly around the mouth. [: The near edge of a sturdy wooden dining table anchors the lower frame at a shallow oblique angle beneath the hands, providing a spatial anchor.] Fragments of other East Asian children sharing the same table remain in out-of-focus soft blur at the left peripheral edge. Restrained daytime ambient light shapes the scene with high contrast, sharply emphasizing the glistening blood-red details of the meat against the dim, earthy surroundings.",
            "outfit_assignments": [
              {
                "character_id": "C23",
                "outlook_id": "O25"
              }
            ],
            "source_facts": [
              "꼬마 아이들이 고기 파티를 벌인다.",
              "손으로 고기를 집어먹기 바쁘다.",
              "입가가 핏기로 붉게 얼룩져도 상관없다.",
              "짐승처럼 고기를 뜯어내기 위해 고개를 뒤로 젖힌 자세"
            ],
            "visual_inferences": [
              "The sturdy dining table anchors the bottom frame to connect the close-up to the communal meal context.",
              "Other children remain in blurred peripheral focus to maintain the group atmosphere without distracting from the primary subject's shocking state."
            ],
            "creative_decisions": [
              "Placed the main subject in the center-right to create visual tension.",
              "Used a tight close-up and shallow depth of field (background skipped) to emphasize the visceral, animalistic feeding behavior.",
              "High-contrast lighting isolates the striking red of the blood against neutral earthy tones."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "53a0d04acb03eb2d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "953dd463790f136b",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "같은 공간(반월 식당)에서의 이전 샷(Shot 10)의 빛과 공간 분위기 연속성 유지",
        "_shot_index": 16,
        "visible_entities": [
          "C23"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 21,
            "shot_index": 16
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "End the inherited dolly-in at the children's seated head height, isolating one child in a tight close-up as the head snaps backward and the hands pull the meat apart beneath the chin. The child's blood-covered mouth and strained three-quarter profile occupy most of the center-right frame, while fragments of other eating children and the table remain soft at the edges as spatial evidence of the feast.",
            "lighting_mood": "Daytime ambient light appropriate to the restaurant preserves a restrained, high-contrast view of the blood-red detail and earthy surroundings.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C23"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C23",
                "outlook_id": "O25"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "multipurpose_store_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The cluttered interior of the island establishment, functioning as a combined diner, convenience store, and fishing tackle shop. The space is filled with earthy daytime ambient lighting that maintains a firm contrast and a restrained, neutral palette. Various goods and kitchen elements occupy the background, establishing the multipurpose nature of the small shop.",
                "applies_to_shots": [
                  2,
                  10,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "초등학교 교실 정도 크기에 식당과 편의점, 낚시 용품점 등을 총 망라한 잡화점",
                  "mixed restaurant-store interior held in soft depth",
                  "table and kitchen behind providing natural scale",
                  "Daytime ambient light appropriate to the interior is shaped with restrained contrast and aged neutral color",
                  "restrained earthy palette"
                ],
                "visual_inferences": [
                  "The walls and shelves are lined with a dense mix of everyday groceries and fishing gear, reflecting the remote island setting."
                ],
                "creative_decisions": [
                  "The background elements are kept in soft focus during tighter shots to maintain emphasis on the subjects while preserving the authentic, slightly claustrophobic atmosphere of the shop."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dining_table",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A sturdy dining table situated in the center of the restaurant area. It serves as the physical anchor for the scene, providing a surface for the photo album and later supporting the heavy trays of raw meat.",
                "applies_to_shots": [
                  2,
                  10,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "테이블에 앉은 손녀 지후",
                  "식당 테이블에 나란히 앉은",
                  "쟁반을 테이블 위로 반쯤 내려놓은",
                  "the table remain soft at the edges"
                ],
                "visual_inferences": [
                  "The table is made of a worn, practical material like wood or rustic laminate, suitable for an old countryside diner."
                ],
                "creative_decisions": [
                  "Positioned consistently across shots to ground the spatial relationship between the characters sitting at it, the server approaching it, and the children feasting on it."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 10,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C23O25",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "489c36724041b0ae"
      },
      {
        "scene_index": 22,
        "heading": "실외. 금월도 일각 - 낮/ 밤",
        "beat_title": "밤의 어둠과 기이하게 시든 꽃들",
        "representative_moment": "마을 길을 따라 심어진 꽃들이 바짝 말라 비틀어진 채 스산한 밤의 어둠 속에 놓여 있는 풍경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium tracking shot from low standing height, very low nighttime illumination",
            "t2i_prompt": "Photorealistic cinematic still. A medium view from a low standing height along the dark lane. Successive flower beds sit near the lower edge of the frame, filled with withered, twisted, dried flowers. The camera lens remains nearly level, focusing on the brittle textures of the dead flowers extending toward the middle distance. In the background, a stone wall and a house are faintly visible in the deep night. Very low nighttime ambient illumination provides restrained contrast across the scene without unestablished light sources, casting subtle shadows on the twisted stems.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: 짙은 어둠 속, 마을 곳곳에 피어 있던 꽃들이 바짝 말라 비틀어진 기이한 밤의 상태.",
              "beat situation: 생생하게 폈던 꽃들도 사르륵 사그라져 시들어버린다.",
              "time: 밤(Night)"
            ],
            "visual_inferences": [
              "The camera angle is kept low and level to capture the continuous line of withered flower beds along the path.",
              "The stone wall and house provide structural anchoring to the settlement environment."
            ],
            "creative_decisions": [
              "Used a highly restrained, low-key lighting setup to emphasize the eerie, drained atmosphere without artificial brightness.",
              "Focused heavily on the tactile, brittle texture of the withered flowers in the foreground to convey the sudden decay."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flower",
                "usage_kind": "redraw",
                "source_phrase": "withered, twisted, dried flowers"
              },
              {
                "owned_token": "flower bed",
                "usage_kind": "redraw",
                "source_phrase": "Successive flower beds sit near the lower edge of the frame"
              },
              {
                "owned_token": "flowerpot",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "house",
                "usage_kind": "anchor",
                "source_phrase": "and a house"
              },
              {
                "owned_token": "lane",
                "usage_kind": "anchor",
                "source_phrase": "along the dark lane"
              },
              {
                "owned_token": "power line",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "anchor",
                "source_phrase": "a stone wall"
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "75cfb09615a6b96d",
              "owned_hash": "fbc268ad42c8330d",
              "camera_direction_hash": "ffa5d7645ac981e9",
              "owned_usage_hash": "910e796523b0fb35",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "flower",
                  "violating_phrase": "withered, twisted, dried flowers",
                  "reason": "The prompt describes the flowers as withered and dried, which is a visual state change of the existing background elements explicitly required by the shot intent ('바짝 말라 비틀어진 채').",
                  "verdict": "allowed_visual_state_change"
                },
                {
                  "owned_object": "flower bed",
                  "violating_phrase": "Successive flower beds sit near the lower edge of the frame",
                  "reason": "The flower beds are mentioned only to specify their position at the lower edge of the frame as a spatial reference, with no intention to redraw or modify the beds themselves.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "house",
                  "violating_phrase": "and a house",
                  "reason": "The house is mentioned as faintly visible in the background to establish depth and composition, acting as an anchor as declared by the producer.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "lane",
                  "violating_phrase": "along the dark lane",
                  "reason": "The lane is used as a spatial and directional reference for the camera's position, aligning with the producer's declaration as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "stone wall",
                  "violating_phrase": "a stone wall",
                  "reason": "The stone wall is referenced solely as a background element to establish composition and atmosphere, serving as an anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 22,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track at low standing height along the settlement path, holding a close-to-medium view in which successive beds of withered flowers pass from the near lower edge toward the middle distance. Keep the lens nearly level rather than beginning the later upward turn, allowing the twisted flower shapes to form an uneasy lateral rhythm through the dark settlement.",
            "lighting_mood": "Very low nighttime ambient illumination renders the dried flowers in restrained contrast without introducing an unestablished light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "drain",
              "flower",
              "flower bed",
              "flowerpot",
              "gate",
              "house",
              "lane",
              "power line",
              "shrub",
              "stone wall",
              "streetlight",
              "utility pole",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L18B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "ec7f57b835027c0f"
      },
      {
        "scene_index": 23,
        "heading": "실외. 금월도 숲길 - 밤",
        "beat_title": "어둠 속을 거침없이 돌파하는 고산들",
        "representative_moment": "고산들이 칠흑 같은 해송 숲길을 한 발을 띄운 채 질주하듯 지나가는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "waist-height backward tracking shot, faint moonlight against blue-black forest depth",
            "t2i_prompt": "Photorealistic cinematic still. Observed from a distance at waist height, a Korean man in his 30s in dark outdoor clothes is captured in mid-stride advancing rapidly along a dark dirt path. His full body fits within the frame, with his shoes positioned in the lower area and his head near the upper edge. He is seen at a three-quarter angle from the right, one foot suspended just off the ground and his body pitched forward, gazing into the distance. The fabric of his jacket trails backward in the direction opposite to his rapid forward motion. Faint moonlight provides the only illumination, shaping his silhouette against the dense blue-black depth of the pine forest. Thick pine trunks flank both sides of the frame, and the unlit path recedes into the deep shadows behind him.",
            "outfit_assignments": [],
            "source_facts": [
              "S24 action: 산들이 울창한 해송 나무 숲을 불빛 하나 없이 빠른 발걸음으로 재촉하며 지나감.",
              "shot description: tracking backward at waist height, keeping full-length figure in wide frame",
              "shot description: mid-stride, one foot suspended, dense pine path receding behind"
            ],
            "visual_inferences": [
              "waist-height wide framing allows the full body to be visible in a single cohesive shot",
              "rapid forward movement implies fabric trailing in the opposite direction",
              "faint moonlight creates subtle edge lighting to separate the figure from the dark background"
            ],
            "creative_decisions": [
              "composition places the figure fully within the frame to emphasize his unhindered movement through the isolated space",
              "cool blue-black color temperature establishes the heavy folk-occult thriller night mood without completely losing background detail"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b5dfbdafe0aa3ee7",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "559af0bf1ca4a092",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 23,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track backward at approximately waist height, slightly offset from the path center, keeping 고산들 full-length as he advances rapidly toward the camera. Time the wide frame to the suspended beat between steps, with one foot lifted and his body pitched forward while the dense pine path recedes behind him.",
            "lighting_mood": "Faint moonlight provides the only stated illumination, shaping 고산들 against the blue-black depth of the pine forest.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "L19"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "8e24de5de90b458c"
      },
      {
        "scene_index": 24,
        "heading": "실내. 반월 식당 - 밤",
        "beat_title": "불안한 홀로서기",
        "representative_moment": "어두운 식당 한가운데서 잔뜩 긴장한 채 굳게 닫힌 할머니의 방문을 쳐다보는 수리영의 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Static shoulder-height medium framing from behind, high-contrast low-key moonlight setup",
            "t2i_prompt": "Photorealistic cinematic still. A young Korean woman stands with her back to the camera in the lower center foreground, looking off-screen, with a closed room door visible in the middle-center background. Viewed from behind at shoulder height, she maintains a highly taut and defensive physical posture. She leans forward slightly with her shoulders drawn high up in tension, keeping her arms pulled close to her torso. The interior of the empty dining room is engulfed in deep, isolating darkness with no artificial lights turned on. Weak, faint moonlight filters through the side windows, barely illuminating her back silhouette and the unresponsive door against the heavy shadows swallowing the broad unoccupied space.",
            "outfit_assignments": [],
            "source_facts": [
              "할머니 방도 불이 꺼진 것 같은 모양.",
              "긴장이 팽배한 얼굴의 수리영, 크게 숨을 들여쉬며 주변을 돌아본다.",
              "식당은 창으로 스며드는 어수룩한 달빛에 가까스로 사물 분간이 될 정도."
            ],
            "visual_inferences": [
              "fixed_element su_ri_young_tense_posture: highly taut and defensive posture, shoulders drawn high, arms close to torso",
              "fixed_element restaurant_dark_moonlight: isolating darkness, no artificial lights, faint moonlight",
              "Demographic derived from scenario: a young Korean woman"
            ],
            "creative_decisions": [
              "Positioning the closed room door directly in the middle-center background to anchor the spatial tension between the isolated character and her visual destination.",
              "Using cool, low-key moonlight to trace the tense lines of her raised shoulders from behind, emphasizing her anxiety in the dark environment."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ba0fec0affc78606",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "383ade743b127af9",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Hold static at shoulder height behind 김지후(강수리영), framing her at medium distance with her back in the lower center and 강영란(흰 머리 여자)의 closed room door directly beyond. Her raised shoulders and slight forward lean create a taut line of attention toward the unresponsive door, while enough of the dark dining room remains at the sides to register the absence of others.",
            "lighting_mood": "Faint moonlight entering through the restaurant windows barely separates 김지후(강수리영), the closed door, and the surrounding darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "closed room door",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "su_ri_young_tense_posture",
                "element_type": "character_state",
                "character_name": "Kim Ji-hoo (Kang Su-ri-young)",
                "description": "The young Korean woman maintains a highly taut and defensive physical posture, with her shoulders drawn high up in tension. She keeps her arms and hands pulled close to her torso while cautiously navigating the space. Her overall body language distinctly reflects a state of holding her breath in anxiety.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "긴장이 팽배한 얼굴의 수리영",
                  "Her raised shoulders and slight forward lean create a taut line of attention",
                  "caught holding her breath with shoulders drawn high and hands close to her torso"
                ],
                "visual_inferences": [
                  "Keeping arms close to the body implies a defensive reaction to the dark and empty environment",
                  "Demographic cues applied as a young Korean woman in a modern setting"
                ],
                "creative_decisions": [
                  "Emphasizing the physical silhouette of raised shoulders to visually communicate the character's internal fear and isolation without relying on facial expressions alone"
                ],
                "confidence": "high"
              },
              {
                "element_id": "restaurant_dark_moonlight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the empty dining room is engulfed in deep, isolating darkness with no artificial light sources turned on. Weak and faint moonlight filters through the windows, barely providing enough illumination to distinguish the surrounding space. The broad unoccupied areas of the restaurant remain mostly swallowed by heavy shadows.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "식당은 창으로 스며드는 어수룩한 달빛에 가까스로 사물 분간이 될 정도",
                  "Faint moonlight entering through the restaurant windows barely separates the darkness",
                  "Weak moonlight through the windows leaves the restaurant barely readable"
                ],
                "visual_inferences": [
                  "All electrical lights in the room are completely switched off",
                  "Corners and areas away from the windows pitch into near total blackness"
                ],
                "creative_decisions": [
                  "Using a high-contrast, low-key moonlight setup to make the environment feel vast, desolate, and highly obscuring to heightening the tension"
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "c13c4c666d041af1"
      },
      {
        "scene_index": 24,
        "heading": "25. 실내. 반월 식당 - 밤",
        "beat_title": "어둠 속에 홀로 남겨진 수리영",
        "representative_moment": "텅 빈 어두운 식당 한가운데서 잔뜩 긴장한 채 숨을 참고 있는 수리영의 전신.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level observer view to full-body framing, high-contrast low-key moonlight",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level observer view across an empty dining room, the floor visible around the subject. A young Korean woman stands near the center, full body visible from head to shoes. She is positioned at three-quarter angle from the right, looking off-screen. Her shoulders are drawn high up in extreme tension, breath held, arms and hands pulled cautiously close to her torso in a taut, defensive physical posture. The interior is engulfed in deep, isolating darkness with no artificial light sources turned on. Weak, faint moonlight filters through the windows, barely providing enough illumination to outline her silhouette and the broad unoccupied areas of the restaurant. A closed room door remains visible deeper in the heavily shadowed background. The camera focuses on the stark contrast between her defensive body language and the vast, desolate shadows.",
            "outfit_assignments": [],
            "source_facts": [
              "식당은 창으로 스며드는 어수룩한 달빛에 가까스로 사물 분간이 될 정도",
              "할머니 방도 불이 꺼진 것 같은 모양. 산들 모습도 보이지 않는다.",
              "긴장이 팽배한 얼굴의 수리영, 크게 숨을 들여쉬며 주변을 돌아본다."
            ],
            "visual_inferences": [
              "fixed_element su_ri_young_tense_posture: The young Korean woman maintains a highly taut and defensive physical posture, with her shoulders drawn high up in tension.",
              "fixed_element restaurant_dark_moonlight: The interior of the empty dining room is engulfed in deep, isolating darkness with no artificial light sources turned on.",
              "Eye-level camera placement naturally accommodates the full-body framing while showing the floor space around her."
            ],
            "creative_decisions": [
              "Broad areas of unoccupied restaurant space are kept in heavy shadows to emphasize her isolation and vulnerability.",
              "The faint moonlight is used as a rim light to separate her silhouette from the deep background darkness."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "028e1a4112ae1318",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "393aa128e62ddcdb",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 24,
        "dependency_reason": "이전 샷에서 확립된 식당 내부의 구조(창문, 닫힌 방문) 및 어두운 달빛 조명 분위기 연속성 유지",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 24,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the inherited shallow arc and dolly outward across the dining room, preserving 김지후(강수리영) near the center while changing primarily to a full-body distance. She is caught holding her breath with shoulders drawn high and hands close to her torso, surrounded by broad areas of unoccupied restaurant space.",
            "lighting_mood": "Weak moonlight through the windows leaves the restaurant barely readable, isolating the figure in deep surrounding darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "su_ri_young_tense_posture",
                "element_type": "character_state",
                "character_name": "Kim Ji-hoo (Kang Su-ri-young)",
                "description": "The young Korean woman maintains a highly taut and defensive physical posture, with her shoulders drawn high up in tension. She keeps her arms and hands pulled close to her torso while cautiously navigating the space. Her overall body language distinctly reflects a state of holding her breath in anxiety.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "긴장이 팽배한 얼굴의 수리영",
                  "Her raised shoulders and slight forward lean create a taut line of attention",
                  "caught holding her breath with shoulders drawn high and hands close to her torso"
                ],
                "visual_inferences": [
                  "Keeping arms close to the body implies a defensive reaction to the dark and empty environment",
                  "Demographic cues applied as a young Korean woman in a modern setting"
                ],
                "creative_decisions": [
                  "Emphasizing the physical silhouette of raised shoulders to visually communicate the character's internal fear and isolation without relying on facial expressions alone"
                ],
                "confidence": "high"
              },
              {
                "element_id": "restaurant_dark_moonlight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the empty dining room is engulfed in deep, isolating darkness with no artificial light sources turned on. Weak and faint moonlight filters through the windows, barely providing enough illumination to distinguish the surrounding space. The broad unoccupied areas of the restaurant remain mostly swallowed by heavy shadows.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "식당은 창으로 스며드는 어수룩한 달빛에 가까스로 사물 분간이 될 정도",
                  "Faint moonlight entering through the restaurant windows barely separates the darkness",
                  "Weak moonlight through the windows leaves the restaurant barely readable"
                ],
                "visual_inferences": [
                  "All electrical lights in the room are completely switched off",
                  "Corners and areas away from the windows pitch into near total blackness"
                ],
                "creative_decisions": [
                  "Using a high-contrast, low-key moonlight setup to make the environment feel vast, desolate, and highly obscuring to heightening the tension"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 24,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "3db32a8bf41cef50"
      },
      {
        "scene_index": 25,
        "heading": "실외. 숲속 동굴 앞 - 밤",
        "beat_title": "주저하는 발걸음",
        "representative_moment": "An Asian man standing with his back to the camera, hesitating before a large, dark cave entrance reinforced with timber.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium distance observer shot from behind",
            "t2i_prompt": "Photorealistic cinematic still. An Asian adult man in a dark jacket stands with his back to the camera in the lower-middle foreground, facing the large cave entrance in the middle-center background. Captured from an eye-level observer position directly behind him, his halted figure occupies the lower frame with his weight stalled on his front foot, his gaze directed off-screen into the darkness. The cave entrance is bordered by a heavy timber post and a horizontal timber beam, creating an irregular constructed border around the natural opening. Low nighttime ambient illumination casts restrained contrast on the man's shoulders and the wooden structures, leaving the cave interior completely opaque and unreadable.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: back to camera, weight stalled on front foot, facing the cave entrance",
              "scene text: A large natural cave entrance reinforced with timber, pitch black inside",
              "scene text: The figure stands hesitating, unable to enter easily"
            ],
            "visual_inferences": [
              "eye-level camera placing the figure in the lower frame emphasizes the overwhelming size of the cave entrance above him",
              "low nighttime ambient light creating restrained contrast against the opaque void"
            ],
            "creative_decisions": [
              "placed the figure in the lower-middle foreground to build a sense of scale and spatial tension with the background cave",
              "used deep shadows and opaque blackness for the cave interior to evoke suspense and hesitation"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cave entrance",
                "usage_kind": "anchor",
                "source_phrase": "facing the large cave entrance in the middle-center background"
              },
              {
                "owned_token": "fallen leaf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "timber beam",
                "usage_kind": "anchor",
                "source_phrase": "and a horizontal timber beam"
              },
              {
                "owned_token": "timber post",
                "usage_kind": "anchor",
                "source_phrase": "bordered by a heavy timber post"
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "vine",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b793f61c218338a1",
              "owned_hash": "ac3c40a7b0788186",
              "camera_direction_hash": "7eb1469f056e19de",
              "owned_usage_hash": "20ffc00761e38ec0",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "cave entrance",
                  "violating_phrase": "facing the large cave entrance in the middle-center background",
                  "reason": "The cave entrance is used purely as a spatial anchor and direction reference for the character's gaze, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "timber beam",
                  "violating_phrase": "and a horizontal timber beam",
                  "reason": "The timber beam is mentioned to describe the existing background boundaries and lighting, functioning as an anchor with no redraw requested.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "timber post",
                  "violating_phrase": "bordered by a heavy timber post",
                  "reason": "The timber post is described as part of the pre-existing environment bordering the entrance, acting as a structural anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 22,
        "dependency_reason": "exact_background ref_usage를 통해 이전 샷의 동굴 입구 배경(L18B06) 연속성 유지",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 25,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Begin static at eye level behind 고산들, holding him at medium distance with the large cave entrance centered directly ahead on the same axis. His halted back occupies the lower middle of the frame, while the reinforced opening and the unreadable darkness beyond retain greater visual weight above him.",
            "lighting_mood": "Low nighttime ambient illumination holds 고산들 and the reinforced entrance in restrained contrast while leaving the cave interior opaque.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "large cave entrance",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cave entrance",
              "fallen leaf",
              "fern",
              "rock",
              "timber beam",
              "timber post",
              "tree",
              "vine"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 22,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L18B06",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "1e0911efc0eebf08"
      },
      {
        "scene_index": 26,
        "heading": "27. 실외. 반월 식당 뒤뜰 - 밤",
        "beat_title": "창고 문 너머의 불빛과 비밀",
        "representative_moment": "수리영이 허름한 창고 문에 귀를 대고 숨죽여 안쪽의 소리를 엿듣고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Hold static at head height in a close side profile parallel to the door, low-ambient night lighting with warm candlelight edge light",
            "t2i_prompt": "Photorealistic cinematic still. An East Asian young woman in right profile, neck craned forward with her ear pressed flat against a shabby, weathered wooden warehouse door. Her face is positioned slightly off-center, eyes looking down, with one hand bracing lightly against the textured wood. The door is slightly ajar, creating a narrow vertical gap just beside her profile. Warm, flickering candlelight spills through this crack from the interior, casting a sharp, warm rim light along her listening profile, sharply contrasting with the dim, low-ambient dark nighttime environment. The viewpoint is held static at head height, running parallel to the door's plane.",
            "outfit_assignments": [],
            "source_facts": [
              "다가가는 수리영. 창고 문에 귀를 대고 소리를 들어본다.",
              "문 밖으로 불빛이 새어나오는 허름한 창고",
              "일렁이는 촛불"
            ],
            "visual_inferences": [
              "fixed_element shabby_warehouse_door_gap applied to environment state",
              "The character is in right profile to face the door, eyes looking down to focus on listening",
              "Warm edge-lighting on the face from the narrow vertical gap against dark ambient night"
            ],
            "creative_decisions": [
              "Emphasized the side profile framing parallel to the door to highlight the physical contact of the ear against the wood",
              "Focused the lighting mood entirely on the high-contrast rim light from the crack to build suspense"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bucket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "corrugated metal panel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "doorframe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "electrical wire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light bulb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "313a7718cacb9312",
              "owned_hash": "1b2a192b43f3c41d",
              "camera_direction_hash": "d4d5f15974027b39",
              "owned_usage_hash": "591935f2c407bfc3",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [],
        "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": "Hold static at head height in a close side profile parallel to the warehouse door, with 김지후(강수리영)'s ear pressed to its plane and her face placed slightly off-center. Her neck cranes forward and one hand braces lightly near the door while the thin line of escaping light remains visible beside her profile.",
            "lighting_mood": "The warehouse's escaping light edges the listening profile against otherwise low nighttime ambient illumination.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L22B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "shabby_warehouse_door_gap",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A shabby, weathered wooden warehouse door slightly ajar, creating a narrow vertical gap. Warm, flickering candlelight spills through this crack from the interior, contrasting sharply with the low-ambient, dark nighttime environment of the outdoor backyard.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "문 밖으로 불빛이 새어나오는 허름한 창고",
                  "문 틈 사이로 안을 들여다 본다",
                  "일렁이는 촛불"
                ],
                "visual_inferences": [
                  "The door is made of aged, textured wood, reflecting the 'shabby' description.",
                  "The escaping light creates a sharp, warm edge-lighting effect against the surrounding dark ambient night."
                ],
                "creative_decisions": [
                  "The textured door surface and the glowing vertical gap dominate the immediate background, emphasizing the tension of spying through a restricted opening."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "f5cdcd2edf9c5314"
      },
      {
        "scene_index": 26,
        "heading": "27. 실외. 반월 식당 뒤뜰 - 밤",
        "beat_title": "창고 안을 엿보는 수리영",
        "representative_moment": "수리영이 허름한 창고의 좁은 문틈에 한쪽 눈을 바짝 대고 일렁이는 촛불이 비치는 내부를 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level dolly-in close framing on the face, emphasizing the narrow vertical gap and warm candlelight contrast",
            "t2i_prompt": "Photorealistic cinematic still. An Asian young woman presses her face against the narrow warehouse door opening in the middle-center foreground, seen in three-quarter left profile and looking off-screen. [: A shabby, weathered wooden warehouse door slightly ajar] creates a vertical channel beside her. Her visible eye and compressed three-quarter face occupy most of the frame. Warm, flickering candlelight spills through this crack from the interior, reaching her visible eye and leaving the rest of her face in low contrast, contrasting sharply with the low-ambient, dark nighttime environment of the outdoor backyard.",
            "outfit_assignments": [],
            "source_facts": [
              "문 틈 사이로 안을 들여다 본다",
              "일렁이는 촛불"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: face pressed to door gap",
              "fixed_element description: shabby, weathered wooden warehouse door slightly ajar",
              "The escaping light creates a sharp, warm edge-lighting effect against the surrounding dark ambient night."
            ],
            "creative_decisions": [
              "Close framing focusing entirely on the eye and the vertical door edge to emphasize the tension of spying",
              "High-contrast lighting mood contrasting the warm interior candlelight with the cool, dark exterior shadow"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bucket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "corrugated metal panel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "doorframe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "electrical wire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light bulb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b8a739d84c06186f",
              "owned_hash": "1b2a192b43f3c41d",
              "camera_direction_hash": "e1430a5cdb55c61c",
              "owned_usage_hash": "591935f2c407bfc3",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 26,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Finish the short lateral move and dolly-in at eye height, angling slightly back toward 김지후(강수리영)'s face as she aligns one eye with the narrow door opening. The visible eye and compressed three-quarter face occupy most of the frame, with the door edges forming a narrow vertical channel that preserves the act of spying without becoming an extreme close-up.",
            "lighting_mood": "Flickering candlelight from inside the warehouse reaches the visible eye through the narrow opening, leaving the rest of the face in low contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "narrow warehouse door opening",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L22B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "shabby_warehouse_door_gap",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A shabby, weathered wooden warehouse door slightly ajar, creating a narrow vertical gap. Warm, flickering candlelight spills through this crack from the interior, contrasting sharply with the low-ambient, dark nighttime environment of the outdoor backyard.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "문 밖으로 불빛이 새어나오는 허름한 창고",
                  "문 틈 사이로 안을 들여다 본다",
                  "일렁이는 촛불"
                ],
                "visual_inferences": [
                  "The door is made of aged, textured wood, reflecting the 'shabby' description.",
                  "The escaping light creates a sharp, warm edge-lighting effect against the surrounding dark ambient night."
                ],
                "creative_decisions": [
                  "The textured door surface and the glowing vertical gap dominate the immediate background, emphasizing the tension of spying through a restricted opening."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "ef3aa0092f5ddb9a"
      },
      {
        "scene_index": 27,
        "heading": "28. 실내. 창고 - 밤",
        "beat_title": "기괴한 제단의 발견",
        "representative_moment": "일렁이는 촛불들 사이로, 피가 가득 찬 사발과 기괴한 검은 염소 머리가 놓인 제단을 비춘다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Observer POV dolly forward at slightly lowered chest height, wide framing, flickering low-key illumination",
            "t2i_prompt": "Photorealistic cinematic still. Observer perspective from slightly lowered chest height. Layered candle flames cross the lower foreground, providing flickering low-key illumination. In the middle of the frame, the central ritual altar is visible, anchored by a large bowl overflowing with dark red blood positioned directly in front of a black goat head. An ancient-looking wooden spear with a horn-like tip rests horizontally on top of the goat head. Unfamiliar ritual ornaments extend laterally across the setup. Trails of incense smoke rise among the flames. The [L24: dark storage room interior] is heavily cloaked in deep shadows creeping across the bare walls and upper ceiling corners, revealing deep red blood, black forms, and aged neutrals.",
            "outfit_assignments": [],
            "source_facts": [
              "어둑한 공간을 밝히는 십수 개의 촛불들… 향이 피어오르는 제단 위에는 검은 염소 머리.",
              "그 앞 사발에는 검붉은 피가 한 가득이다.",
              "염소 머리 위에 모셔진 아주 오래 되어보이는 길다란 창"
            ],
            "visual_inferences": [
              "fixed_element ritual_altar_setup: Central arrangement of the bowl and black goat head, with the spear resting horizontally on the head.",
              "fixed_element candlelit_storage_room: The space is entirely illuminated by scattered candles, casting dynamic deep shadows across bare walls."
            ],
            "creative_decisions": [
              "Framed from slightly lowered chest height to allow candle flames to cross the lower foreground while keeping the altar fully readable in the middle of the frame.",
              "Emphasized low-key warm illumination to highlight the deep red blood and black forms against the surrounding deep shadows."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "anchor",
                "source_phrase": "the central ritual altar is visible"
              },
              {
                "owned_token": "bowl",
                "usage_kind": "anchor",
                "source_phrase": "anchored by a large bowl overflowing with dark red blood"
              },
              {
                "owned_token": "candle",
                "usage_kind": "anchor",
                "source_phrase": "Layered candle flames cross the lower foreground"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "goat head",
                "usage_kind": "anchor",
                "source_phrase": "positioned directly in front of a black goat head"
              },
              {
                "owned_token": "incense",
                "usage_kind": "anchor",
                "source_phrase": "Trails of incense smoke rise"
              },
              {
                "owned_token": "ritual ornament",
                "usage_kind": "anchor",
                "source_phrase": "Unfamiliar ritual ornaments extend laterally"
              },
              {
                "owned_token": "shadow",
                "usage_kind": "anchor",
                "source_phrase": "heavily cloaked in deep shadows creeping across the bare walls"
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "spear",
                "usage_kind": "anchor",
                "source_phrase": "An ancient-looking wooden spear with a horn-like tip rests horizontally"
              },
              {
                "owned_token": "storage rack",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d4428170ddc9a904",
              "owned_hash": "e79a5e407e1070bd",
              "camera_direction_hash": "8ede362b3ae6a3a8",
              "owned_usage_hash": "cb73efa37c26a9a0",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "altar",
                  "violating_phrase": "the central ritual altar is visible",
                  "reason": "The prompt mentions the altar to establish visibility and composition, which is a valid anchor reference matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bowl",
                  "violating_phrase": "anchored by a large bowl overflowing with dark red blood",
                  "reason": "The bowl is used as a compositional anchor point and its blood content is described without newly generating or altering the asset.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "candle",
                  "violating_phrase": "Layered candle flames cross the lower foreground",
                  "reason": "The candles and their flames are referenced for foreground composition and lighting context, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "goat head",
                  "violating_phrase": "positioned directly in front of a black goat head",
                  "reason": "The goat head is used strictly as a spatial anchor to position the bowl and spear, with no intent to redraw.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "incense",
                  "violating_phrase": "Trails of incense smoke rise",
                  "reason": "The prompt describes smoke rising from the existing incense for atmospheric effect, acting as an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "ritual ornament",
                  "violating_phrase": "Unfamiliar ritual ornaments extend laterally",
                  "reason": "The ornaments are referred to for lateral composition, confirming they act as spatial anchors.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shadow",
                  "violating_phrase": "heavily cloaked in deep shadows creeping",
                  "reason": "Shadows are described as an environmental lighting and atmosphere effect, serving as an anchor reference.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "spear",
                  "violating_phrase": "An ancient-looking wooden spear with a horn-like tip rests horizontally",
                  "reason": "The spear is described in its resting position and state to establish the scene layout, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "L24"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Dolly forward at slightly lowered chest height from several meters away, letting multiple candle flames cross the lower foreground without obscuring the altar. Keep the blood-filled bowl and black goat head fully readable together in the middle of the frame, with the surrounding unfamiliar ornaments extending laterally to establish the ritual arrangement.",
            "lighting_mood": "The stated candle flames provide flickering low-key illumination, revealing deep red blood, black forms, aged neutrals, and brief muted highlights across the altar.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "L24"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "altar",
              "bowl",
              "candle",
              "door",
              "goat head",
              "incense",
              "ritual ornament",
              "shadow",
              "shed",
              "spear",
              "storage rack"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "candlelit_storage_room",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, eerie storage room interior heavily cloaked in deep shadows. The space is illuminated entirely by the flickering, low-key glow of dozens of scattered candles, which cast dynamic shadows across the bare walls and upper ceiling corners.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "어둑한 공간을 밝히는 십수 개의 촛불들",
                  "어두운 천장 구석",
                  "Flickering candlelight holds her in partial relief"
                ],
                "visual_inferences": [
                  "The surrounding walls are bare and rough, typical of a neglected storage space.",
                  "The heavy, creeping shadows create a claustrophobic and unsettling atmosphere."
                ],
                "creative_decisions": [
                  "Relied exclusively on the warm but dim candlelight to create a high-contrast, eerie low-key lighting environment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ritual_altar_setup",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A grotesque ritual altar featuring a black goat head at its center. A large bowl overflowing with dark red blood sits directly in front of the goat head. An ancient-looking wooden spear with a horn-like tip rests horizontally on top of the goat head. The arrangement is surrounded by bizarre, unrecognizable ornaments and numerous lit candles.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "제단 위에는 검은 염소 머리",
                  "그 앞 사발에는 검붉은 피가 한 가득이다",
                  "주변 장식들은 불교도, 전통 무교도 아닌 것 같은 섬뜩하고 기괴한 느낌",
                  "염소 머리 위에 모셔진 아주 오래 되어보이는 길다란 창",
                  "나무로 된 창대와 동물의 뿔 같은 것으로 만든 것처럼 보이는 창끝"
                ],
                "visual_inferences": [
                  "The spear is placed securely across the horns or top of the goat head to remain stable.",
                  "The ornaments appear crude and unsettling, enhancing the bizarre cult-like setup."
                ],
                "creative_decisions": [
                  "Arranged the dark red blood and the black goat head centrally to stand out distinctly amidst the warm candlelight."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L23B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "81172d22f3831696"
      },
      {
        "scene_index": 27,
        "heading": "실내. 창고 - 밤",
        "beat_title": "제단과 매달린 형체",
        "representative_moment": "넋을 잃고 제단을 바라보는 수리영의 등 뒤, 어두운 천장 구석에 기괴한 형체가 스르륵 나타난다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium distance shot from behind at shoulder height, tilting up to capture the upper corner, eerie low-key lighting with high-contrast candlelight",
            "t2i_prompt": "Photorealistic cinematic still. In the middle-center midground, C01O01 in a casual jacket, an Asian young woman facing the altar, stands transfixed, sharing the dim candlelit storage room with the wall and ceiling corner in the upper-right background. Observed from behind at shoulder height, her torso and back occupy the center frame at medium distance, leaning forward with her gaze directed off-screen. Clinging across the upper ceiling corner, a grotesque humanoid figure, an elderly Asian woman, emerges as a dark silhouette at a three-quarter angle from the right. The hanging figure's body volume is preserved against the dim ambient fill, her face fully swallowed in deep shadow with no discernible features, eyes fixed on C01O01 below. Flickering candles cast dynamic shadows, holding the young woman in partial relief, while the anchored altar, black goat head, overflowing bowl, and ancient spear rest dimly lit in the forward space.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영은 제단 위 무언가에만 정신이 팔려있다",
              "수리영 뒤, 벽과 천장 구석에 매달린 무언가가 스윽- 움직인다",
              "사람 같기도, 괴물 같기도, 혹은 할머니 영란 같기도 한 형체"
            ],
            "visual_inferences": [
              "fixed_element candlelit_storage_room: A dark, eerie storage room interior heavily cloaked in deep shadows",
              "fixed_element ritual_altar_setup: A grotesque ritual altar featuring a black goat head at its center",
              "The ceiling figure is positioned in deep shadow, watching the unaware young woman from above"
            ],
            "creative_decisions": [
              "Used a medium distance camera positioned behind C01 at shoulder height to simultaneously capture her transfixed state and the creeping threat in the upper corner within a single frame",
              "Applied the entity-aware silhouette policy for the hanging figure, rendering her as a dark shape with preserved volume but a featureless face swallowed in shadow",
              "Employed 'sharing the dim candlelit storage room' to satisfy the fg/bg shared anchor rule"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "anchor",
                "source_phrase": "the anchored altar"
              },
              {
                "owned_token": "bowl",
                "usage_kind": "anchor",
                "source_phrase": "overflowing bowl"
              },
              {
                "owned_token": "candle",
                "usage_kind": "anchor",
                "source_phrase": "Flickering candles"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "goat head",
                "usage_kind": "anchor",
                "source_phrase": "black goat head"
              },
              {
                "owned_token": "incense",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ritual ornament",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shadow",
                "usage_kind": "anchor",
                "source_phrase": "dynamic shadows"
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "spear",
                "usage_kind": "anchor",
                "source_phrase": "ancient spear"
              },
              {
                "owned_token": "storage rack",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "2856f3d31896b5e9",
              "owned_hash": "e79a5e407e1070bd",
              "camera_direction_hash": "22c77faf08d96fe6",
              "owned_usage_hash": "7732531cc405b7ee",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "altar",
                  "violating_phrase": "the anchored altar",
                  "reason": "The altar is referenced to establish the character's orientation and as dimly lit in the space, acting as a spatial anchor in agreement with the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "bowl",
                  "violating_phrase": "overflowing bowl",
                  "reason": "The bowl is mentioned as resting dimly lit in the foreground, serving as a spatial anchor without redraw instructions, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "candle",
                  "violating_phrase": "Flickering candles",
                  "reason": "The candles are referenced to describe the environmental light source, acting as an anchor, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "goat head",
                  "violating_phrase": "black goat head",
                  "reason": "The goat head is mentioned as resting dimly lit in the space, serving as a spatial anchor, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shadow",
                  "violating_phrase": "dynamic shadows",
                  "reason": "Shadows are mentioned as an environmental effect of the candles, functioning as a scene anchor, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "spear",
                  "violating_phrase": "ancient spear",
                  "reason": "The spear is referenced as resting dimly lit in the forward space, acting as a spatial anchor, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "same location and continuity of the ritual altar setup from previous shots",
        "_shot_index": 5,
        "visible_entities": [
          "C01",
          "L24"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 27,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Settle at the end of the inherited dolly-out behind 김지후(강수리영) at shoulder height, holding her centrally at medium distance while tilting high enough to reserve the upper corner behind her. Her absorbed back remains directed toward the altar, and the hanging 기괴한 인간형 실루엣 emerges in the upper side of the same frame without drawing her gaze.",
            "lighting_mood": "Flickering candlelight holds 김지후(강수리영) in partial relief while allowing the hanging silhouette to emerge only as a dark shape in the upper corner.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "wall and ceiling corner",
                  "screen_zone": "upper_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김지후(강수리영) facing the altar",
                  "screen_zone": "middle_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "L24"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "altar",
              "bowl",
              "candle",
              "door",
              "goat head",
              "incense",
              "ritual ornament",
              "shadow",
              "shed",
              "spear",
              "storage rack"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "candlelit_storage_room",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, eerie storage room interior heavily cloaked in deep shadows. The space is illuminated entirely by the flickering, low-key glow of dozens of scattered candles, which cast dynamic shadows across the bare walls and upper ceiling corners.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "어둑한 공간을 밝히는 십수 개의 촛불들",
                  "어두운 천장 구석",
                  "Flickering candlelight holds her in partial relief"
                ],
                "visual_inferences": [
                  "The surrounding walls are bare and rough, typical of a neglected storage space.",
                  "The heavy, creeping shadows create a claustrophobic and unsettling atmosphere."
                ],
                "creative_decisions": [
                  "Relied exclusively on the warm but dim candlelight to create a high-contrast, eerie low-key lighting environment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ritual_altar_setup",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A grotesque ritual altar featuring a black goat head at its center. A large bowl overflowing with dark red blood sits directly in front of the goat head. An ancient-looking wooden spear with a horn-like tip rests horizontally on top of the goat head. The arrangement is surrounded by bizarre, unrecognizable ornaments and numerous lit candles.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "제단 위에는 검은 염소 머리",
                  "그 앞 사발에는 검붉은 피가 한 가득이다",
                  "주변 장식들은 불교도, 전통 무교도 아닌 것 같은 섬뜩하고 기괴한 느낌",
                  "염소 머리 위에 모셔진 아주 오래 되어보이는 길다란 창",
                  "나무로 된 창대와 동물의 뿔 같은 것으로 만든 것처럼 보이는 창끝"
                ],
                "visual_inferences": [
                  "The spear is placed securely across the horns or top of the goat head to remain stable.",
                  "The ornaments appear crude and unsettling, enhancing the bizarre cult-like setup."
                ],
                "creative_decisions": [
                  "Arranged the dark red blood and the black goat head centrally to stand out distinctly amidst the warm candlelight."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L23B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "22de687ffa4f2e17"
      },
      {
        "scene_index": 28,
        "heading": "29. 실외. 뒤뜰 - 밤",
        "beat_title": "마른침을 삼키며 숲길을 바라보는 두려움",
        "representative_moment": "어두운 숲길 입구를 향해 시선을 고정한 C01이 극도의 긴장감 속에 굳은 표정으로 마른침을 삼키고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "close framing at face height, near-black low-key night exposure",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual top, a young Korean woman, seen at three-quarter angle from the left at face height. Her rigid pretty oval face with a pale impression occupies the upper frame, framed by long black straight hair falling past her locked shoulders, eyes fixed off-screen in a fearful stare. Her throat remains visible in the lower third, muscles tensed mid-swallow. Near-black, low-key night exposure with no streetlight preserves just enough restrained contrast to highlight her eyes and the contours of her neck against [: an out-of-focus, pitch-black night void].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S29 action: '엄두가 나지 않아 주저하는 수리영. 마른침을 삼킨다.'",
              "shot description: close-up of Kim Ji-hoo's face, staring off-screen at the pitch-black forest entrance, throat rising"
            ],
            "visual_inferences": [
              "face occupying the upper frame and throat in the lower third to visually emphasize the swallowing motion and fear",
              "pitch-black out-of-focus background surface representing the unseen dark forest entrance"
            ],
            "creative_decisions": [
              "used near-black, low-key lighting with minimal contrast to enhance the suspense and isolate her tense expression",
              "incorporated stable_traits 'pretty oval face' and 'pale impression' into the facial description"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "ditch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6a85f4506f9b3358",
              "owned_hash": "bfc8f9553088bc05",
              "camera_direction_hash": "46824b2464b4aaa1",
              "owned_usage_hash": "d75c9c494643f84c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 28,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Derived from the end of the shallow arc, the camera settles at face height just off Kim Ji-hoo's frontal axis and completes a restrained dolly-in to a close framing. Her rigid face occupies the upper frame while her throat remains visible in the lower third, catching the exact rise of the swallow without losing her fearful stare toward the forest entrance off-screen.",
            "lighting_mood": "Near-black, low-key night exposure with no streetlight, preserving only enough restrained contrast to read her eyes and moving throat.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L24B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "4aff900b2973a7e0"
      },
      {
        "scene_index": 29,
        "heading": "30. 실외. 숲길 - 밤",
        "beat_title": "어두운 숲길에서 핸드폰 불빛에 의지하는 수리영",
        "representative_moment": "C01이 어두운 해송 숲길에서 핸드폰 플래시 불빛을 앞쪽으로 비추며 긴장한 채 서 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide full-body view, hard phone flash contrast against low-key ambient night darkness",
            "t2i_prompt": "Photorealistic cinematic still. At eye level on the path centerline, a wide full-body view of C01O01 in a dark jacket, a young Asian woman with long straight black hair and a youthful pale complexion, at three-quarter angle from the right. She is in mid-stride, her arm extended into the upper-middle foreground holding a lit phone, gazing into the distance. The phone flash points away from her along the dirt path, cutting a hard, narrow beam of light. The narrow path extends from the lower foreground behind her into the distant center, flanked by a shadowed shrub and pine tree trunks enveloped in extremely low-key ambient night darkness.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "핸드폰 플래쉬 불빛이 어둑한 해송 나무 숲을 비춘다.",
              "핸드폰 불빛 하나에만 의지한 수리영이 거친 숨을 몰아쉬며 좁은 길을 간다.",
              "밤"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: mid-stride",
              "phone arm extended forward",
              "narrow dirt path flanked by bushes and pine trees"
            ],
            "creative_decisions": [
              "centered full-body framing at eye level to establish the isolated light beam",
              "hard contrast between phone flash and dense forest shadow for suspense"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "anchor",
                "source_phrase": "along the dirt path"
              },
              {
                "owned_token": "pine tree",
                "usage_kind": "anchor",
                "source_phrase": "pine tree trunks"
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "root",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "anchor",
                "source_phrase": "shadowed shrub"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1bb2cb64547e4e78",
              "owned_hash": "20378b483cd3c823",
              "camera_direction_hash": "19a4cab7aa053493",
              "owned_usage_hash": "ab54fd8a3c024614",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "path",
                  "violating_phrase": "The narrow path extends from the lower foreground behind her into the distant center",
                  "reason": "The path is mentioned purely as a spatial anchor for the camera direction and lighting beam, which aligns with the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pine tree",
                  "violating_phrase": "pine tree trunks enveloped in extremely low-key ambient night darkness",
                  "reason": "The pine tree trunks are used as background framing elements to define the ambient darkness, matching the producer's declaration of anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shrub",
                  "violating_phrase": "flanked by a shadowed shrub",
                  "reason": "The shrub is referenced as a side element to frame the path, indicating no redraw or modification, which matches the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "exact_background location continuity from S27_Shot5 (night_pine_forest_environment)",
        "_shot_index": 1,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level on the path centerline, the static camera holds a wide full-body view of Kim Ji-hoo facing into the route. She is centered with her lit phone extended into the upper-middle foreground, while the narrow path and pine forest remain readable around her before any retreat toward cover begins.",
            "lighting_mood": "The phone flash provides the only stated light, cutting a hard, narrow field through an otherwise dark night forest.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "fence",
              "gate",
              "path",
              "pine tree",
              "rock",
              "root",
              "shrub"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_pine_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark pine forest at night, featuring a narrow dirt path flanked by dense, shadowed bushes and pine trees. The environment is heavily enveloped in low-key ambient darkness, obscuring deep background details.",
                "applies_to_shots": [
                  1,
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "어둑한 해송 나무 숲",
                  "밤",
                  "dark night forest",
                  "extremely low-key",
                  "very low-key night illumination"
                ],
                "visual_inferences": [
                  "The dense foliage and bushes provide thick enough cover for the characters to hide from passersby."
                ],
                "creative_decisions": [
                  "Maintaining a heavy contrast and deep shadows to emphasize the isolation and suspense of the nighttime forest setting."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L23B06",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "72c52012fc31d8ba"
      },
      {
        "scene_index": 29,
        "heading": "실외. 숲길 - 밤",
        "beat_title": "여상의 기습적인 입막음",
        "representative_moment": "어두운 수풀에 웅크린 C01의 입을 여상의 두툼한 손이 뒤에서 강하게 틀어막은 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "close framing at crouched head height with extremely low-key night lighting",
            "t2i_prompt": "Photorealistic cinematic still. Viewed at crouched head height, C01O01 in a casual jacket, a young Korean woman with pale skin and long black hair, crouching down low to stay hidden, body tightly compacted at three-quarter angle from the right, shoulders recoiling backward, her single widened eye looking off-screen. A Korean man's thick hand is tightly clamped over her mouth from behind, exerting firm force, while a small portion of his head and shoulder is partially visible in soft focus at the left frame edge, leaning in extremely close over her shoulder, his gaze directed off-screen. Her lower face and his clamping hand dominate the view. [: dense shadowed bushes softly block the lower and side frame edges, while a small dark spatial gap behind the man hints at a narrow dirt path]. The lighting is extremely low-key, allowing only restrained night contrast across her widened eye, his clamping hand, and her lower face against the deep ambient darkness.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "숲속에 몸을 숨긴다",
              "뒤에서 입을 틀어막는 두툼한 손",
              "놀라서 휘둥그레 커지는 눈",
              "어둑한 해송 나무 숲",
              "핸드폰 불을 끄는"
            ],
            "visual_inferences": [
              "The camera captures the scene from crouched head height to emphasize the hiding posture",
              "The man's face is partially obscured and in soft focus to maintain framing on the ambush interaction",
              "Dense bushes provide cover and frame the immediate foreground"
            ],
            "creative_decisions": [
              "Extremely low-key lighting with deep shadows to highlight the suspense and the suddenness of the contact",
              "Soft background focus ensures the viewer's attention remains on the widened eye and clamping hand"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "fallen branch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "forest path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "leaf litter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "vine",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e8f9c19d64671cde",
              "owned_hash": "00ef232d71346003",
              "camera_direction_hash": "7b74b8c945fed1b3",
              "owned_usage_hash": "eb62e222b9d475f2",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A hard cut places the lens at Kim Ji-hoo's crouched head height, close and slightly off her front axis, leaving a narrow strip of space behind her shoulder. Her lower face and Kim Yeo-sang's clamping hand occupy most of the frame, while one widened eye and a small portion of his head and shoulder preserve the identity and direction of the ambush.",
            "lighting_mood": "With the phone flash switched off, the shot remains extremely low-key and allows only restrained night contrast across the eye, hand, and lower face.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L23B05",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_pine_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark pine forest at night, featuring a narrow dirt path flanked by dense, shadowed bushes and pine trees. The environment is heavily enveloped in low-key ambient darkness, obscuring deep background details.",
                "applies_to_shots": [
                  1,
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "어둑한 해송 나무 숲",
                  "밤",
                  "dark night forest",
                  "extremely low-key",
                  "very low-key night illumination"
                ],
                "visual_inferences": [
                  "The dense foliage and bushes provide thick enough cover for the characters to hide from passersby."
                ],
                "creative_decisions": [
                  "Maintaining a heavy contrast and deep shadows to emphasize the isolation and suspense of the nighttime forest setting."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ji_hoo_crouching_posture",
                "element_type": "character_state",
                "character_name": "Kim Ji-hoo",
                "description": "Kim Ji-hoo is crouching down low in the bushes to stay hidden. Her body is tightly compacted, with her shoulders drawn inward and her head kept at a low level to avoid being seen.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "수풀에 몸을 낮춘",
                  "crouched",
                  "shoulders recoiling backward",
                  "chin drawn inward"
                ],
                "visual_inferences": [
                  "Her knees are bent deeply, and her torso is lowered close to the ground, maintaining a static hiding posture throughout the sequence."
                ],
                "creative_decisions": [
                  "Framing her posture to convey a sense of shrinking into the environment to avoid detection by the passing youths."
                ],
                "confidence": "high"
              },
              {
                "element_id": "yeo_sang_compressed_position",
                "element_type": "character_state",
                "character_name": "Kim Yeo-sang",
                "description": "Kim Yeo-sang is crouched directly behind Kim Ji-hoo, compressing his body into the shared narrow hiding space. His head and shoulders lean in extremely close to her back, maintaining tight physical proximity.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "김지후의 뒤에 밀착한 채",
                  "뒤에서 나타난",
                  "over_shoulder, leaning in",
                  "compressed directly behind her"
                ],
                "visual_inferences": [
                  "He mirrors her crouching height exactly, pressing forward to stay hidden alongside her within the same patch of bushes."
                ],
                "creative_decisions": [
                  "Positioning him aggressively close to her to highlight the suddenness of his ambush and their shared confinement in the darkness."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "1ca7f5666992d5fc"
      },
      {
        "scene_index": 29,
        "heading": "실외. 숲길 - 밤",
        "beat_title": "여상의 등장과 쉿",
        "representative_moment": "어둠 속 수풀에 숨은 C01의 뒤에서 나타난 여상이 손가락을 입에 대며 조용히 하라는 신호를 보내는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium-close side two-shot from shoulder height of crouching figures, very low-key night illumination",
            "t2i_prompt": "Photorealistic cinematic still. A medium-close side two-shot captured at the shoulder height of the crouching figures in a dark night forest. C01O01 in casual clothes, a pale young Korean woman with long straight black hair, crouched in right profile on the near side of a shared patch of dense shrubs and ferns, her chin drawn inward and eyes wide open looking off-screen. A Korean middle-aged man is compressed directly behind her in the same shared hiding space in right profile, his thick hand reaching forward with one finger touching his lips in a hushing gesture, his gaze also directed off-screen. Very low-key night illumination holds both profiles in subdued contrast, preserving their tight physical proximity against the deep shadows of the background trees and vines.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "숨죽이며 지나가는 그들을 지켜보는 수리영.",
              "뒤에서 입을 틀어막는 두툼한 손! - 놀라서 휘둥그레 커지는 눈!",
              "쉿- 손가락으로 입을 가리는 여상."
            ],
            "visual_inferences": [
              "fixed_element night_pine_forest_environment",
              "fixed_element ji_hoo_crouching_posture",
              "fixed_element yeo_sang_compressed_position",
              "Unregistered character Yeo-sang rendered via generic descriptor as a Korean middle-aged man"
            ],
            "creative_decisions": [
              "Lateral track side framing to capture both profiles in a tight two-shot, emphasizing their physical proximity.",
              "Very low-key illumination applied to keep the background obscured and focus on the subdued contrast of their profiles."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "fallen branch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fern",
                "usage_kind": "anchor",
                "source_phrase": "a shared patch of dense shrubs and ferns"
              },
              {
                "owned_token": "forest path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "leaf litter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "anchor",
                "source_phrase": "a shared patch of dense shrubs and ferns"
              },
              {
                "owned_token": "tree",
                "usage_kind": "anchor",
                "source_phrase": "background trees and vines"
              },
              {
                "owned_token": "vine",
                "usage_kind": "anchor",
                "source_phrase": "background trees and vines"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "3857fc7b592e90dc",
              "owned_hash": "00ef232d71346003",
              "camera_direction_hash": "0f53c85ea1a0b9ad",
              "owned_usage_hash": "ef0082c455fdcf7a",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "fern",
                  "violating_phrase": "a shared patch of dense shrubs and ferns",
                  "reason": "The prompt uses ferns purely as a spatial anchor to position the crouching characters, matching the producer's declaration of an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shrub",
                  "violating_phrase": "a shared patch of dense shrubs and ferns",
                  "reason": "The prompt uses shrubs as a spatial/hiding spot anchor rather than requesting a redesign or redraw, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "tree",
                  "violating_phrase": "background trees and vines",
                  "reason": "Trees are referenced only to establish the background shadow composition, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "vine",
                  "violating_phrase": "background trees and vines",
                  "reason": "Vines are referenced as background elements to anchor the dark forest lighting context, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "이전 샷(Shot 3)의 배경 환경(어두운 해송 숲)과 인물들의 은폐 위치(수풀)를 그대로 공유하며 순간만 전환됨.",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 29,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The lateral track reaches shoulder height beside the concealed pair and pauses in a medium-close side two-shot as Kim Yeo-sang's finger touches his lips. Kim Ji-hoo occupies the near side of the frame in profile, with Kim Yeo-sang compressed directly behind her and the youths' route held off-screen along their shared sightline.",
            "lighting_mood": "Very low-key night illumination holds both profiles in subdued contrast, with the phone flash remaining off.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B05",
            "reference_usage": "exact_background",
            "owned_objects": [
              "fallen branch",
              "fern",
              "forest path",
              "leaf litter",
              "rock",
              "shrub",
              "tree",
              "vine"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_pine_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark pine forest at night, featuring a narrow dirt path flanked by dense, shadowed bushes and pine trees. The environment is heavily enveloped in low-key ambient darkness, obscuring deep background details.",
                "applies_to_shots": [
                  1,
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "어둑한 해송 나무 숲",
                  "밤",
                  "dark night forest",
                  "extremely low-key",
                  "very low-key night illumination"
                ],
                "visual_inferences": [
                  "The dense foliage and bushes provide thick enough cover for the characters to hide from passersby."
                ],
                "creative_decisions": [
                  "Maintaining a heavy contrast and deep shadows to emphasize the isolation and suspense of the nighttime forest setting."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ji_hoo_crouching_posture",
                "element_type": "character_state",
                "character_name": "Kim Ji-hoo",
                "description": "Kim Ji-hoo is crouching down low in the bushes to stay hidden. Her body is tightly compacted, with her shoulders drawn inward and her head kept at a low level to avoid being seen.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "수풀에 몸을 낮춘",
                  "crouched",
                  "shoulders recoiling backward",
                  "chin drawn inward"
                ],
                "visual_inferences": [
                  "Her knees are bent deeply, and her torso is lowered close to the ground, maintaining a static hiding posture throughout the sequence."
                ],
                "creative_decisions": [
                  "Framing her posture to convey a sense of shrinking into the environment to avoid detection by the passing youths."
                ],
                "confidence": "high"
              },
              {
                "element_id": "yeo_sang_compressed_position",
                "element_type": "character_state",
                "character_name": "Kim Yeo-sang",
                "description": "Kim Yeo-sang is crouched directly behind Kim Ji-hoo, compressing his body into the shared narrow hiding space. His head and shoulders lean in extremely close to her back, maintaining tight physical proximity.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "김지후의 뒤에 밀착한 채",
                  "뒤에서 나타난",
                  "over_shoulder, leaning in",
                  "compressed directly behind her"
                ],
                "visual_inferences": [
                  "He mirrors her crouching height exactly, pressing forward to stay hidden alongside her within the same patch of bushes."
                ],
                "creative_decisions": [
                  "Positioning him aggressively close to her to highlight the suddenness of his ambush and their shared confinement in the darkness."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L23B05",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "f2289542dc66f6a9"
      },
      {
        "scene_index": 30,
        "heading": "31. 실외. 숲속 - 밤",
        "beat_title": "불길하게 팽팽해지는 핏빛 포댓자루",
        "representative_moment": "어두운 숲속에서 청년의 어깨에 걸쳐진 P17의 한쪽 면이 안에서 밀어내는 힘으로 불룩하게 튀어나오고, 검붉은 액체가 표면을 타고 흐르는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Shoulder-height close framing with hard, restrained contrast and shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. A close view from shoulder height focusing on the outward-straining side of P17. The stained cloth of P17 bulges outward, pushed taut from within, with a thick trail of dark red liquid crossing its lower surface. At the side frame edge, a partial shoulder slice of an Asian male figure in dark workwear supports the sack, establishing scale. The composition keeps P17 below forty percent of the full frame. Very low night illumination creates hard, restrained contrast that sharply highlights the dark red trail and the bulging fabric against the dark surroundings. [: soft out-of-focus dense night forest with low underbrush and a natural dirt floor, entirely swallowed in extremely low-key, compressed shadows].",
            "outfit_assignments": [],
            "source_facts": [
              "S31 action: '청년들의 포댓자루 안에서 무언가가 쉴 새 없이 꿈틀거린다. 그 밤에도 검붉은 액체가 줄줄 흘러나오는 것이 보인다.'",
              "shot description: close view of the stained, outward-straining section of the sack with a dark red trail",
              "shot description: retaining a sliver of the carrier at the frame edge for scale"
            ],
            "visual_inferences": [
              "fixed_element night_forest_environment: dense forest, dirt floor, low vegetation at night",
              "Shallow depth of field applied to the background to maintain close-framing focus on the sack while keeping the environment ambiguous"
            ],
            "creative_decisions": [
              "Positioned the sack to occupy less than 40% of the frame as directed, emphasizing the taut bulge against the dark void",
              "Used hard contrast lighting to isolate the dark red liquid on the stained cloth without revealing the light source",
              "Replaced L01 with L02 for background labeling as requested in the correction block"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d203f7ef461d40b8",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b2331d8d4b1a8a10",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 24,
        "dependency_reason": "이전 샷에서 확립된 깊고 어두운 숲속의 환경 상태(야간 조명, 수풀) 연속성 유지",
        "_shot_index": 2,
        "visible_entities": [
          "P17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 30,
            "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 shoulder height beside the carried sack, the dolly-in resolves on a close view of the stained, outward-straining section while retaining a sliver of the carrier and surrounding forest for scale. The dark red trail crosses the lower part of the sack as an internal push pulls the cloth taut toward camera, but the object remains below forty percent of the full frame.",
            "lighting_mood": "Very low night illumination uses hard, restrained contrast to separate the dark red liquid and taut bulge without specifying an unstated source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "P17"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surrounding environment is a dense forest at night, featuring low vegetation, underbrush, and a natural dirt floor. It is enveloped in extremely low-key, high-contrast illumination that creates deep, compressed shadows. No distinct artificial light sources are visible, maintaining a uniformly dark and suspenseful atmosphere.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲속 - 밤",
                  "납작 수풀 (low vegetation)",
                  "Very low night illumination",
                  "Extremely low-key night exposure"
                ],
                "visual_inferences": [
                  "The terrain is uneven and covered with natural debris typical of a wild, unpaved forest floor."
                ],
                "creative_decisions": [
                  "Using restrained, high-contrast lighting to outline silhouettes and textures of the vegetation against the pitch-black surroundings without introducing any unmotivated ambient light."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 24,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "213ce31adb11b90d"
      },
      {
        "scene_index": 30,
        "heading": "31. 실외. 숲속 - 밤",
        "beat_title": "발각 위기에 처해 숲바닥에 납작 엎드린 수리영과 여상",
        "representative_moment": "발각될 위기에 처한 C01과 C10이 숲바닥 수풀 뒤에 납작 엎드려 숨을 죽이고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low observer at ground level with a widened wide framing, extremely low-key night exposure",
            "t2i_prompt": "Photorealistic cinematic still. Low observer at ground level. The surrounding environment is a dense forest at night, featuring low vegetation, underbrush, and a natural dirt floor, enveloped in extremely low-key, high-contrast illumination that creates deep, compressed shadows without distinct artificial light sources. C01O01 in a casual jacket, an East Asian young woman, and C10O13 in fisher workwear, an East Asian middle-aged man, share the same natural dirt floor they both occupy. C01O01 lies prone nearer the lens along the lower-left plane at a three-quarter angle from the left, her cheek lowered, looking down at the dirt. C10O13 extends behind her toward the middle-right in left profile, lying prone with elbows tucked, also looking down. Both figures are kept motionless, hidden below the foreground concealment line of the low vegetation.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C10",
                "outlook_id": "O13"
              }
            ],
            "source_facts": [
              "scene text: 납작 수풀 뒤에 엎드려 시선을 피하는 수리영과 여상.",
              "shot description: 발각될 위기에 처한 김지후(강수리영)와 김여상이 수풀 뒤 바닥에 납작 엎드려 숨을 죽인 상태.",
              "camera direction: drops the lens nearly to the forest floor behind the low vegetation, facing laterally across both prone bodies in a slightly widened close composition."
            ],
            "visual_inferences": [
              "fixed_element night_forest_environment: extremely low-key, high-contrast illumination that creates deep, compressed shadows",
              "low observer at ground level geometrically matches the prone bodies on the dirt floor"
            ],
            "creative_decisions": [
              "Framing scale 'wide' ensures both figures are fully integrated into the low vegetation without isolated body-part close-ups, maintaining spatial consistency.",
              "Applying the shared spatial anchor 'share the same natural dirt floor they both occupy' to robustly bind their fg/bg separation into a single physical space."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "4a55b53701ee614a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "4223177c87fe8f5a",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 24,
        "dependency_reason": "previous_shot_refs(S24_Shot5) - exact_background 룰에 따라 이전 샷의 배경 요소(숲속 환경)와 일관된 묘사 유지 (fixed_elements를 통해 강제됨)",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "C10",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 30,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A cut drops the lens nearly to the forest floor behind the low vegetation, facing laterally across both prone bodies in a slightly widened close composition. Kim Ji-hoo lies nearer the lens along the lower-left plane while Kim Yeo-sang extends behind her toward the middle-right, both kept below the vegetation line and motionless.",
            "lighting_mood": "Extremely low-key night exposure keeps the vegetation and prone figures in compressed, high-contrast layers without introducing an unstated light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "C10",
              "L20"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C10",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The surrounding environment is a dense forest at night, featuring low vegetation, underbrush, and a natural dirt floor. It is enveloped in extremely low-key, high-contrast illumination that creates deep, compressed shadows. No distinct artificial light sources are visible, maintaining a uniformly dark and suspenseful atmosphere.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲속 - 밤",
                  "납작 수풀 (low vegetation)",
                  "Very low night illumination",
                  "Extremely low-key night exposure"
                ],
                "visual_inferences": [
                  "The terrain is uneven and covered with natural debris typical of a wild, unpaved forest floor."
                ],
                "creative_decisions": [
                  "Using restrained, high-contrast lighting to outline silhouettes and textures of the vegetation against the pitch-black surroundings without introducing any unmotivated ambient light."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 24,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C10O13",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7ccf764b4860f1cc"
      },
      {
        "scene_index": 31,
        "heading": "32. 실외. 숲속 염소 축사 - 밤",
        "beat_title": "염소 떼 사이를 가로지르는 청년들",
        "representative_moment": "C25가 꿈틀거리는 P17을 멘 채 검은 염소 떼 사이를 무심한 표정으로 걷고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tracking at chest height, wide lateral view, low-key night illumination",
            "t2i_prompt": "Photorealistic cinematic still. Tracking at chest height, providing a wide lateral view. C25O28 in dark workwear, a tanned young Asian man with a rough expression and short black hair, is captured in left profile, frozen mid-stride across the frame. One of his feet is planted on the dirt ground, the other suspended in the air. He gazes into the distance with an apathetic look. He carries P17, a large bloodstained sack shouldered high; the long side of P17 bulges and deforms outward as if struggling violently from within. [L20: A dark forest animal pen at night] surrounds the scene with dense shadows. Numerous black goats occupy the lower foreground and deep background, facing varied directions and creating high-contrast layers under the restrained low-key night illumination, leaving a clear lateral path for the man.",
            "outfit_assignments": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "source_facts": [
              "shot description: village youths carrying struggling sacks walking through black goats",
              "S32 action: '포댓자루 안 무언가는 사력을 다해 꿈틀거리지만 청년들은 신경쓰지 않는다'",
              "DP directive: mid-stride, one foot down and one lifted, profile_left, gaze distant"
            ],
            "visual_inferences": [
              "C25's tanned face, short black hair, and rough impression carried from stable_traits",
              "L20 background maintains the exact structural elements of the dark forest pen established in the prior shot"
            ],
            "creative_decisions": [
              "Chest-height tracking angle clearly separates the mid-stride legs and the shouldered sack",
              "High-contrast, low-key lighting emphasizes the eerie silhouettes of the foreground and background goats"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1a2193bc9d14d131",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9984637da277cfa3",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 30,
        "dependency_reason": "이전 샷(S30_Shot2)에 설정된 축사 배경(exact_background)과 일관된 공간 묘사",
        "_shot_index": 2,
        "visible_entities": [
          "C25",
          "L20",
          "P17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 31,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Tracking at chest height alongside the route, the camera holds a wide lateral view of the village youths threading through the herd. Their bodies cross the middle band with alternating lifted feet, while the struggling sack remains readable over a carrier's shoulder and black goats occupy the foreground and background without blocking the procession.",
            "lighting_mood": "Low-key night illumination renders the black goats and moving youths in restrained, high-contrast layers without assigning an unstated source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C25",
              "L20",
              "P17"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 30,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C25O28",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "46dfed8092a09f89"
      },
      {
        "scene_index": 32,
        "heading": "실외/ 실내. 도축장 - 밤",
        "beat_title": "가건물 안을 엿보는 절박한 여상",
        "representative_moment": "어두운 가건물 외벽에 바짝 붙어 창틀 너머를 들여다보는 여상(C10).",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium framing along the exterior wall, low-key night ambient light",
            "t2i_prompt": "Photorealistic cinematic still. C10O13 in a fishing suit, an Asian middle-aged man with short black hair, occupies the left side of the frame in right profile, his head and torso visible. He is leaning close to the rough exterior wall, his neck craning and face pressed near a dirty window, looking off-screen toward the right. The eye-level camera sits close to the wooden wall, looking along its surface. The receding wall runs diagonally away from the camera past the figure. Very low-key natural ambient night light illuminates the scene, leaving the dark, empty forest ahead in deep shadow.",
            "outfit_assignments": [
              {
                "character_id": "C10",
                "outlook_id": "O13"
              }
            ],
            "source_facts": [
              "가건물 밖 어둠 속에서 여상이 벽면에 얼굴을 가까이 대고 안을 들여다보는 고정된 자세.",
              "유리가 깨진 창 하나를 발견한다.",
              "여상의 두 눈은 절박함으로 가득하다."
            ],
            "visual_inferences": [
              "Kim Yeo-sang positioned in right profile against the wall",
              "Eye-level observer perspective aligning with the wall's vanishing point"
            ],
            "creative_decisions": [
              "Placed C10O13 on the left side to leave empty searching space on the right, visually matching the DP's intent for the upcoming camera track",
              "Kept the ambient lighting very low-key to emphasize the darkness of the isolated forest exterior"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "blood collection station",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hook rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slaughter table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tool rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "near a dirty window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b450be0ab2c56229",
              "owned_hash": "fc64f6b55ee12ca3",
              "camera_direction_hash": "48a15c27bace7485",
              "owned_usage_hash": "90bb9a632f0ba233",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "window",
                  "violating_phrase": "near a dirty window",
                  "reason": "The window is used as a spatial anchor to position the character's face, with no instruction to redraw or modify it, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "C10",
          "L25"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 32,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside the structure, the static eye-level camera sits close to the wall and looks along it toward Kim Yeo-sang's profile. He occupies one side of the medium frame with his face pressed near the wall, while the receding exterior surface leaves searching space ahead in the direction the later track will follow.",
            "lighting_mood": "Natural ambient night light appropriate to the exterior is kept very low-key, with no additional source specified.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "L25"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C10",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L25B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "blood collection station",
              "hook rail",
              "sack",
              "slaughter table",
              "tool rack",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C10O13",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L25B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "fe0008bd7e3d831e"
      },
      {
        "scene_index": 32,
        "heading": "실외/ 실내. 도축장 - 밤",
        "beat_title": "어둠 속 기괴한 도축 현장",
        "representative_moment": "마을 청년이 어둠 속 도축장에서 치켜든 칼 아래, 정체불명의 희생자가 버둥거리는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height medium upward angle, very low high-contrast lighting",
            "t2i_prompt": "Photorealistic cinematic still. Shot from a waist-height medium distance on an upward angle. C25O28 in rough dark workwear, an East Asian man in his 20s showing a rugged sunbaked complexion and terrifying savage non-human facial features, stands in three-quarter left profile. His braced torso occupies the right half of the frame, his arm cocked high overhead. He grips a massive slaughter knife that reaches the upper-left quadrant at its highest point, its cutting edge aimed downward. His gaze is directed down toward the lower frame edge, where the partial lower body of an unnamed struggling figure is visible on the slaughter table beneath the intended strike. [: The dark interior is built from unpainted, haphazardly assembled wooden boards enveloped in deep, oppressive shadows. A hook rail and a tool rack holding suspended knives hang against the rear wall.] Very low, high-contrast illumination creates deep shadows, focusing strictly on the raised blade and the attacker's monstrous traits against the pitch-black void.",
            "outfit_assignments": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "source_facts": [
              "도축장 안, 무언가가 어둠 속에서 살려고 버둥댄다",
              "무시무시한 도축용 칼을 휘두르는 마을 청년",
              "Inside the structure at waist height, the camera completes its dolly-in from a medium distance on an upward angle",
              "The blade is seen obliquely above the youth, with its cutting direction aimed toward the lower frame"
            ],
            "visual_inferences": [
              "fixed_element village_youths_beast_appearance: terrifying savage non-human facial features",
              "fixed_element slaughterhouse_dark_interior: haphazardly assembled wooden boards enveloped in deep shadows",
              "the partial lower body of an unnamed struggling figure visible on the slaughter table in the lower frame edge"
            ],
            "creative_decisions": [
              "Placed C25's braced torso on the right and the knife in the upper-left quadrant to create strong diagonal tension toward the lower frame target",
              "Used very low, high-contrast illumination to hide unnecessary background details and emphasize the menacing form of the youth against the darkness"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "blood collection station",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hook rail",
                "usage_kind": "anchor",
                "source_phrase": "A hook rail and a tool rack"
              },
              {
                "owned_token": "sack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slaughter table",
                "usage_kind": "anchor",
                "source_phrase": "on the slaughter table beneath the intended strike"
              },
              {
                "owned_token": "tool rack",
                "usage_kind": "anchor",
                "source_phrase": "and a tool rack holding suspended knives"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d42f755713c35adb",
              "owned_hash": "fc64f6b55ee12ca3",
              "camera_direction_hash": "13cdf8fdc5cef818",
              "owned_usage_hash": "3e4ae2db823d2b4c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "hook rail",
                  "violating_phrase": "A hook rail",
                  "reason": "The prompt references the hook rail as a background spatial anchor, which is consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "slaughter table",
                  "violating_phrase": "on the slaughter table",
                  "reason": "The prompt references the slaughter table purely as a spatial anchor to position the struggling figure, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "tool rack",
                  "violating_phrase": "a tool rack holding suspended knives",
                  "reason": "The prompt mentions the tool rack holding suspended knives as a background element, acting as a spatial anchor, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 32,
        "dependency_reason": "동일 씬 내 이전 샷(S32_Shot1)에서 설정된 도축장 내부 배경(rough wooden boards, 어두운 조명) 및 인물의 상태(beast-like appearance) 연속성 유지",
        "_shot_index": 10,
        "visible_entities": [
          "C25"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 32,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the structure at waist height, the camera completes its dolly-in from a medium distance on an upward angle toward the village youth's raised arm. His braced torso occupies one side of the frame and the slaughter knife reaches the upper opposite quadrant at its highest point, while only the lower edge of the struggling figure remains visible beneath the intended strike.",
            "lighting_mood": "The dark interior is rendered in very low, high-contrast illumination, with the phone flash not yet fired and no other source specified.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C25"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L25B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "blood collection station",
              "hook rail",
              "sack",
              "slaughter table",
              "tool rack",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "village_youths_beast_appearance",
                "element_type": "character_state",
                "character_name": "village youths",
                "description": "The village youths possess a terrifying, beast-like physical appearance. They have savage, non-human facial features and physical traits. They are dressed in rough, practical work clothes suitable for an isolated rural environment.",
                "applies_to_shots": [
                  10,
                  13
                ],
                "element_scope": "full",
                "source_facts": [
                  "마을 청년",
                  "그들은 사람이 아닌, 짐승과도 같은 모습 - 정말 짐승 같은 모습이다"
                ],
                "visual_inferences": [
                  "Their clothing consists of durable, dark-colored rural workwear that appears worn and rough."
                ],
                "creative_decisions": [
                  "Their monstrous traits are organically integrated into their anatomy, emphasizing a grotesque physical mutation rather than just animalistic behavior."
                ],
                "confidence": "high"
              },
              {
                "element_id": "slaughterhouse_dark_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the makeshift structure is built from rough, haphazardly assembled wooden boards. The environment is enveloped in deep, oppressive darkness, reflecting its secretive use as a hidden slaughterhouse.",
                "applies_to_shots": [
                  10,
                  13
                ],
                "element_scope": "full",
                "source_facts": [
                  "나무로 얼기설기 만든 가건물",
                  "도축장 안, 무언가가 어둠 속에서"
                ],
                "visual_inferences": [
                  "The wooden walls are unpainted, splintered, and uneven, with details barely visible within the deep shadows."
                ],
                "creative_decisions": [
                  "The background architectural elements are largely swallowed by the dark void to heighten the horror and focus entirely on the characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 32,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C25O28",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L25B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "cb2707da353e349a"
      },
      {
        "scene_index": 32,
        "heading": "33. 실외/ 실내. 도축장 - 밤",
        "beat_title": "짐승 같은 본색의 폭로",
        "representative_moment": "여상의 핸드폰 플래시 불빛에 의해 피범벅이 된 채 짐승 같은 기괴한 얼굴로 돌아보는 마을 청년들(C25)의 섬뜩한 모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest height observer POV, high-contrast flash exposure, medium group composition",
            "t2i_prompt": "Photorealistic cinematic still. Captured at chest height looking into the dark makeshift structure, multiple figures of C25O28 in dark rural workwear, Korean men in their 20s with terrifying beast-like physical appearance and savage non-human facial features, span the frame in staggered rows. Their torsos and arms occupy the frame, twisted mid-turn, facing the camera. Their heads are snapped forward, looking directly at the camera. Their faces and clothes are heavily smeared with wet blood. A stark, high-contrast flash from the camera axis violently illuminates the group, casting harsh shadows against the deep oppressive darkness of the haphazardly assembled wooden walls. In the background, a hook rail and tool rack hang on the rough wall visible between their shoulders, and a blood collection station sits low in the shadows.",
            "outfit_assignments": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "source_facts": [
              "찰칵- 터지는 플래쉬 불빛. 그 빛에 돌아보는 마을 청년들.",
              "피범벅 그들과 수리영, 여상의 눈이 딱 마주치고…",
              "그들은 사람이 아닌, 짐승과도 같은 모습 - 정말 짐승 같은 모습이다."
            ],
            "visual_inferences": [
              "fixed_element village_youths_beast_appearance: terrifying beast-like physical appearance, savage non-human facial features, dark rural workwear",
              "fixed_element slaughterhouse_dark_interior: haphazardly assembled wooden walls, deep oppressive darkness",
              "Flash from camera axis violently illuminates the group against the darkness"
            ],
            "creative_decisions": [
              "Medium chest-height framing captures torsos and heads to emphasize the sudden grotesque reveal of the group.",
              "Stark, high-contrast lighting mimics a smartphone flash, heightening the horror tone.",
              "Staggered rows of figures create depth and an overwhelming sense of threat."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "blood collection station",
                "usage_kind": "anchor",
                "source_phrase": "and a blood collection station sits low in the shadows"
              },
              {
                "owned_token": "hook rail",
                "usage_kind": "anchor",
                "source_phrase": "a hook rail and tool rack hang on the rough wall visible between their shoulders"
              },
              {
                "owned_token": "sack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slaughter table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tool rack",
                "usage_kind": "anchor",
                "source_phrase": "a hook rail and tool rack hang on the rough wall visible between their shoulders"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "2322b40237c54d96",
              "owned_hash": "fc64f6b55ee12ca3",
              "camera_direction_hash": "fea1192cd0a18bcc",
              "owned_usage_hash": "2754cbe06c7e42fb",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "blood collection station",
                  "violating_phrase": "and a blood collection station sits low in the shadows",
                  "reason": "The prompt refers to the blood collection station sitting low in the shadows as a spatial background anchor without any instruction to redraw or modify its structure, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "hook rail",
                  "violating_phrase": "a hook rail and tool rack hang on the rough wall",
                  "reason": "The prompt mentions the hook rail hanging on the rough wall as a background anchor element without any redraw instruction, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "tool rack",
                  "violating_phrase": "a hook rail and tool rack hang on the rough wall",
                  "reason": "The prompt refers to the tool rack hanging on the wall as a background anchor to establish the scene layout, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 32,
        "dependency_reason": "동일한 씬 내의 도축장 내부 배경(S32_Shot10)과 마을 청년들의 상태적 특성을 유지하기 위해 이전 샷의 배경 데이터를 직접 상속",
        "_shot_index": 13,
        "visible_entities": [
          "C25"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 32,
            "shot_index": 13
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height inside the structure, the pan settles into a close frontal group composition with the window directly behind the camera. The blood-covered village youths span the frame in staggered rows, torsos arrested mid-turn and every face aligned toward the lens at the instant the flash exposes them.",
            "lighting_mood": "The phone-camera flash from the window axis momentarily produces stark, high-contrast exposure across the blood-covered faces and surrounding darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C25"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L25B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "blood collection station",
              "hook rail",
              "sack",
              "slaughter table",
              "tool rack",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "village_youths_beast_appearance",
                "element_type": "character_state",
                "character_name": "village youths",
                "description": "The village youths possess a terrifying, beast-like physical appearance. They have savage, non-human facial features and physical traits. They are dressed in rough, practical work clothes suitable for an isolated rural environment.",
                "applies_to_shots": [
                  10,
                  13
                ],
                "element_scope": "full",
                "source_facts": [
                  "마을 청년",
                  "그들은 사람이 아닌, 짐승과도 같은 모습 - 정말 짐승 같은 모습이다"
                ],
                "visual_inferences": [
                  "Their clothing consists of durable, dark-colored rural workwear that appears worn and rough."
                ],
                "creative_decisions": [
                  "Their monstrous traits are organically integrated into their anatomy, emphasizing a grotesque physical mutation rather than just animalistic behavior."
                ],
                "confidence": "high"
              },
              {
                "element_id": "slaughterhouse_dark_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the makeshift structure is built from rough, haphazardly assembled wooden boards. The environment is enveloped in deep, oppressive darkness, reflecting its secretive use as a hidden slaughterhouse.",
                "applies_to_shots": [
                  10,
                  13
                ],
                "element_scope": "full",
                "source_facts": [
                  "나무로 얼기설기 만든 가건물",
                  "도축장 안, 무언가가 어둠 속에서"
                ],
                "visual_inferences": [
                  "The wooden walls are unpainted, splintered, and uneven, with details barely visible within the deep shadows."
                ],
                "creative_decisions": [
                  "The background architectural elements are largely swallowed by the dark void to heighten the horror and focus entirely on the characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 32,
                "shot_index": 10,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C25O28",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L25B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "39cce24323a83f74"
      },
      {
        "scene_index": 33,
        "heading": "실외. 숲속 - 밤",
        "beat_title": "오솔길에서 마주친 두 사람",
        "representative_moment": "어두운 오솔길을 사이에 두고 멈춰 선 C01과 숲 경계에 서 있는 고산들이 서로 마주보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level static wide profile composition with low-key night exposure",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a young Korean woman with long black hair and a pale expression, stands in the middle-left midground looking toward a young Korean man across the path, while the open path between them recedes into the middle-center background. Captured in right profile, C01O01 is braking on her front foot, pitched forward just after stopping from a desperate run. On the right side of the frame, the young Korean man stands in left profile, his weight fixed at the edge of the dirt path, his eyes fixed on her. The scene is framed from eye level in a static wide composition, making the separation between them the dominant visual fact. A heavy high-contrast shadow from the low-key night exposure envelops the setting, heavily obscuring the deep forest and leaving only the immediate figures, the path, scattered leaf litter, dark undergrowth, and a large tree clearly legible.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "헐레벌떡 숲에서 튀어나오는 수리영. 때마침 다른쪽 숲에서 나오던 산들과 마주친다.",
              "From eye level beside the path, frame 김지후(강수리영) on the left and 고산들 on the right in a static wide profile composition"
            ],
            "visual_inferences": [
              "fixed_element dark_forest_night_lighting: The forest setting is enveloped in a low-key night exposure with heavy, high-contrast shadows.",
              "C01's braking posture and forward pitch from running",
              "Generic identity for the man across the path since his specific C## is not permitted by ID policy"
            ],
            "creative_decisions": [
              "Wide horizontal framing emphasizes the tension and the physical gap between the two characters on the dark path",
              "Low-key high-contrast shadows reinforce the isolation and danger of the surrounding forest"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "leaf litter",
                "usage_kind": "anchor",
                "source_phrase": "scattered leaf litter"
              },
              {
                "owned_token": "path",
                "usage_kind": "anchor",
                "source_phrase": "the dirt path"
              },
              {
                "owned_token": "shadow",
                "usage_kind": "anchor",
                "source_phrase": "A heavy high-contrast shadow"
              },
              {
                "owned_token": "tree",
                "usage_kind": "anchor",
                "source_phrase": "a large tree"
              },
              {
                "owned_token": "undergrowth",
                "usage_kind": "anchor",
                "source_phrase": "dark undergrowth"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8e49393c6f0ed825",
              "owned_hash": "739777e878c31ba7",
              "camera_direction_hash": "d62242edf1df0138",
              "owned_usage_hash": "f4cf1035ee937a05",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "leaf litter",
                  "violating_phrase": "scattered leaf litter",
                  "reason": "The phrase refers to existing leaf litter as a legible background detail for spatial grounding, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "path",
                  "violating_phrase": "across the path",
                  "reason": "The path is referenced as a spatial anchor separating the characters without instruction to redraw or modify its structure, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shadow",
                  "violating_phrase": "A heavy high-contrast shadow",
                  "reason": "The shadow is described as an environmental lighting condition enveloping the setting, serving as an anchor, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "tree",
                  "violating_phrase": "a large tree",
                  "reason": "The large tree is mentioned as a visible background element for environment legibility, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "undergrowth",
                  "violating_phrase": "dark undergrowth",
                  "reason": "The undergrowth is mentioned as a legible background element to establish setting context, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 6,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 33,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From eye level beside the path, frame 김지후(강수리영) on the left and 고산들 on the right in a static wide profile composition, with the open path separating them and the opposing forest boundaries holding each figure at an edge. 김지후(강수리영) is caught just after stopping, pitched forward from her run, while 고산들 remains planted across from her; the perpendicular view makes the distance between them the dominant visual fact.",
            "lighting_mood": "Low-key night exposure keeps the path and faces legible against a restrained, high-contrast forest palette without specifying an unestablished source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "open path between them",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "고산들 across the path",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_left",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L26B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "leaf litter",
              "path",
              "shadow",
              "tree",
              "undergrowth"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dark_forest_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The forest setting is enveloped in a low-key night exposure with heavy, high-contrast shadows. The dense, oppressive darkness of the woods heavily obscures the deep background, keeping only the immediate figures and the dirt path clearly legible.",
                "applies_to_shots": [
                  6,
                  12,
                  13
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲속 - 밤",
                  "Low-key night exposure keeps the path and faces legible against a restrained, high-contrast forest palette",
                  "Low-key night contrast"
                ],
                "visual_inferences": [
                  "There is no prominent moon or artificial light source, making the ambient shadows deep and isolating."
                ],
                "creative_decisions": [
                  "Using high-contrast shadows to enhance the horror and isolation of the deep forest, heightening the tension of the chase and the sudden attack."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L26B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "634586e1d671ffdc"
      },
      {
        "scene_index": 33,
        "heading": "실외. 숲속 - 밤",
        "beat_title": "산들의 괴물 변신과 기절하는 수리영",
        "representative_moment": "동공이 황금빛 직사각형으로 변한 산들이 아래쪽을 섬뜩하게 노려보는 극단적 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up on the eyes with observer dolly, three-quarter view, low-key night contrast",
            "t2i_prompt": "Photorealistic cinematic still. An Asian young man seen in three-quarter left view, the framing an extreme close-up isolating his transformed eyes in the central close field. Only the brow, eyelids, and the bridge of the nose are visible at the frame edges. The eyes display explicitly golden irises with distinct horizontal, rectangular-shaped pupils resembling those of a black goat. The piercing golden pupils aim downward below the lower frame edge, projecting the physical tension of a chokehold. Low-key night contrast isolates the glowing rectangular pupils, while the surrounding facial planes and the absent background fall into heavy, oppressive darkness.",
            "outfit_assignments": [],
            "source_facts": [
              "산들의 눈이 황금색으로 변한다.",
              "동공도 검은 염소의 직사각형 형태로 변하며",
              "목을 움켜쥔 손에 힘을 더한다. 무시무시한 눈빛!"
            ],
            "visual_inferences": [
              "fixed_element sandeul_golden_eyes: Sandeul's eyes are completely transformed, displaying explicitly golden irises with distinct horizontal, rectangular-shaped pupils.",
              "fixed_element dark_forest_night_lighting: The dense, oppressive darkness of the woods heavily obscures the deep background."
            ],
            "creative_decisions": [
              "Extreme close-up framing that strictly retains only the brow, eyelids, and nose bridge at the frame edges to emphasize the grotesque horizontal pupils.",
              "Low-key night contrast used to isolate the glowing golden hue against the heavily shadowed facial planes."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "leaf litter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shadow",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "undergrowth",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "995f89febfec7eaa",
              "owned_hash": "739777e878c31ba7",
              "camera_direction_hash": "3572121a1aaf62fa",
              "owned_usage_hash": "ccc53cf968fcd1c3",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 33,
        "dependency_reason": "동일 씬 내 이전 샷(Shot 6)의 숲속 밤 조명 및 고산들 각성 상태(황금색 직사각형 동공) 연속성 유지",
        "_shot_index": 12,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 33,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Continue the stage’s shoulder-height dolly until both transformed pupils occupy the central close field, retaining only the brow, eyelids, and bridge of the nose at the frame edges. The camera remains slightly off the shared axis in a three-quarter view, and the pupils aim below frame toward 김지후(강수리영), preserving the physical direction of the chokehold.",
            "lighting_mood": "Low-key night contrast isolates the explicitly golden rectangular pupils while the surrounding facial planes fall into restrained darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L26B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sandeul_golden_eyes",
                "element_type": "character_state",
                "character_name": "Sandeul",
                "description": "Sandeul's eyes are completely transformed, displaying explicitly golden irises with distinct horizontal, rectangular-shaped pupils resembling those of a black goat. The piercing golden hue stands out starkly against the surrounding darkness.",
                "applies_to_shots": [
                  12,
                  13
                ],
                "element_scope": "close",
                "source_facts": [
                  "산들의 눈이 황금색으로 변한다.",
                  "동공도 검은 염소의 직사각형 형태로 변하며",
                  "golden rectangular pupils",
                  "golden transformed eyes"
                ],
                "visual_inferences": [
                  "The golden color has a slight luminous or piercing quality in the low-light environment, drawing immediate attention to his monstrous nature."
                ],
                "creative_decisions": [
                  "Focusing strictly on the distinctive horizontal rectangular pupil and the glowing golden iris to emphasize the grotesque transformation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_forest_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The forest setting is enveloped in a low-key night exposure with heavy, high-contrast shadows. The dense, oppressive darkness of the woods heavily obscures the deep background, keeping only the immediate figures and the dirt path clearly legible.",
                "applies_to_shots": [
                  6,
                  12,
                  13
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲속 - 밤",
                  "Low-key night exposure keeps the path and faces legible against a restrained, high-contrast forest palette",
                  "Low-key night contrast"
                ],
                "visual_inferences": [
                  "There is no prominent moon or artificial light source, making the ambient shadows deep and isolating."
                ],
                "creative_decisions": [
                  "Using high-contrast shadows to enhance the horror and isolation of the deep forest, heightening the tension of the chase and the sudden attack."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 33,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "574b46f03db3baae"
      },
      {
        "scene_index": 33,
        "heading": "34. 실외. 숲속 - 밤",
        "beat_title": "Sandeul's Monstrous Attack",
        "representative_moment": "An unregistered young man reveals his golden goat-like eyes as he violently chokes C01 in the deep forest shadows.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight eye-level close composition, low-key night exposure focusing sharply on the glowing golden eyes",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual top, an Asian young woman in her 20s, is compressed into the lower-right foreground in three-quarter left profile, reaching for the hand gripping her neck. Above her, an Asian young man in his 20s leaning into a chokehold occupies the upper-center frame, facing the camera. The young man, acting as the force initiator, presses his firm gripping hand into her throat, while she, as the constrained figure receiving the force, claws at his wrist in a panic. The man's face is sharp in focus; his eyes are completely transformed, displaying explicitly golden irises with distinct horizontal, rectangular-shaped pupils resembling those of a black goat, his terrifying gaze looking down at her. Her face is partially obscured in soft focus to emphasize the violent physical contact. Low-key night exposure with heavy, high-contrast shadows heavily obscures the deep background, leaving only [L26B02: out-of-focus dense forest branches enveloped in oppressive darkness] at the frame edges. The glowing golden irises stand out starkly as the sharpest tonal accent.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Sandeul 갑자기 수리영 목을 콱 움켜쥔다.",
              "산들의 눈이 황금색으로 변한다. 동공도 검은 염소의 직사각형 형태로 변하며",
              "수리영은 충격과 공포에 버둥대며",
              "low-key night exposure with heavy, high-contrast shadows"
            ],
            "visual_inferences": [
              "fixed_element sandeul_golden_eyes: golden irises with horizontal rectangular pupils",
              "fixed_element dark_forest_night_lighting: deep darkness keeping only immediate figures legible",
              "Unregistered entity Sandeul is described generically as 'an Asian young man' per ID policy.",
              "To avoid romantic misinterpretation, applied violent asymmetrical vocabulary ('force initiator', 'constrained figure', 'firm gripping hand')."
            ],
            "creative_decisions": [
              "Placed C01 in the lower-right foreground reaching for the gripping hand to satisfy fsc_001.",
              "Softened C01's face to comply with the close_framing_rules forbidding two sharp close-up faces in one frame.",
              "Skipped background reference due to skipped_close_framing mode, using only a localized frame-edge description."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "leaf litter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shadow",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "undergrowth",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d569d7d4a8c90739",
              "owned_hash": "739777e878c31ba7",
              "camera_direction_hash": "d2b8ed10ab2ff0c8",
              "owned_usage_hash": "ccc53cf968fcd1c3",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 33,
        "dependency_reason": "preserves exact lighting and forest atmosphere from earlier in the chase",
        "_shot_index": 13,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 33,
            "shot_index": 13
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Withdraw along the established axis to a tight eye-level two-person composition, placing 고산들 (육혈귀 각성 상태)의 face near upper center and 김지후(강수리영) compressed into the lower foreground beneath his gaze. His gripping hand and her neck remain visible on the same side of frame, while her twisting shoulders and raised hands make the attack readable without changing the confrontation axis.",
            "lighting_mood": "Low-key night contrast holds the golden transformed eyes as the sharpest tonal accent while keeping both faces readable.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "reaches_for",
                  "gesture_target_label": "the hand gripping her neck",
                  "label": "김지후(강수리영)",
                  "screen_zone": "lower_right",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L26B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sandeul_golden_eyes",
                "element_type": "character_state",
                "character_name": "Sandeul",
                "description": "Sandeul's eyes are completely transformed, displaying explicitly golden irises with distinct horizontal, rectangular-shaped pupils resembling those of a black goat. The piercing golden hue stands out starkly against the surrounding darkness.",
                "applies_to_shots": [
                  12,
                  13
                ],
                "element_scope": "close",
                "source_facts": [
                  "산들의 눈이 황금색으로 변한다.",
                  "동공도 검은 염소의 직사각형 형태로 변하며",
                  "golden rectangular pupils",
                  "golden transformed eyes"
                ],
                "visual_inferences": [
                  "The golden color has a slight luminous or piercing quality in the low-light environment, drawing immediate attention to his monstrous nature."
                ],
                "creative_decisions": [
                  "Focusing strictly on the distinctive horizontal rectangular pupil and the glowing golden iris to emphasize the grotesque transformation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_forest_night_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The forest setting is enveloped in a low-key night exposure with heavy, high-contrast shadows. The dense, oppressive darkness of the woods heavily obscures the deep background, keeping only the immediate figures and the dirt path clearly legible.",
                "applies_to_shots": [
                  6,
                  12,
                  13
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲속 - 밤",
                  "Low-key night exposure keeps the path and faces legible against a restrained, high-contrast forest palette",
                  "Low-key night contrast"
                ],
                "visual_inferences": [
                  "There is no prominent moon or artificial light source, making the ambient shadows deep and isolating."
                ],
                "creative_decisions": [
                  "Using high-contrast shadows to enhance the horror and isolation of the deep forest, heightening the tension of the chase and the sudden attack."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 33,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "a23723042978de64"
      },
      {
        "scene_index": 34,
        "heading": "35. 실내. 달리는 아반테 - 낮",
        "beat_title": "불안에 휩싸여 속도를 높이는 인우",
        "representative_moment": "조수석 시점에서 깁스한 팔로 운전대를 잡고 굳은 표정으로 전방을 주시하는 남성의 모습",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "From the front passenger area at eye level, medium profile composition, natural daytime illumination with restrained contrast",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from the front passenger area at eye level in a medium composition. An Asian adult man in a casual jacket appears in right profile in the upper-left field, his narrowed brow and tense expression visible as his eyes are fixed on the distance. One arm, firmly wrapped in a white medical cast, is braced on the driver-facing side of the steering wheel crossing the lower center. The interior cabin of a modern sedan surrounds him, with the dark dashboard extending across the lower frame as a spatial reference. Beyond the windshield, the daytime road ahead streaks past in the direction opposite to motion. Natural daylight provides restrained, neutral illumination with soft shadows inside the vehicle.",
            "outfit_assignments": [],
            "source_facts": [
              "실내. 달리는 아반테 - 낮",
              "운전대를 잡고 있는 인우는 걱정 가득한 얼굴이다. 다쳤던 한쪽 팔은 깁스를 한 상태.",
              "엑셀을 때려밟아 속도를 높히는 인우."
            ],
            "visual_inferences": [
              "fixed_element moving_car_interior: The interior cabin of a modern sedan moving during the daytime. Dashboard and front structural elements remain consistent.",
              "Viewed from the front passenger area, framing the driver in right profile.",
              "Motion blur on the scenery visible through the windshield indicates high speed."
            ],
            "creative_decisions": [
              "Positioning the character in the upper-left field and the steering wheel in the lower center to emphasize the tense driving posture from the passenger's POV.",
              "Using restrained contrast and neutral lighting to maintain the serious and realistic thriller tone of the scene."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c421e397b1e38b7d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "bd3e4efa35150f55",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 30,
        "dependency_reason": "previous_shot_refs indicates spatial consistency (moving_car_interior) with Scene 30, Shot 2",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 34,
            "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 the front passenger area at 정인우’s eye level, hold a medium profile composition with his face in the upper-left field, the steering wheel and cast arm crossing the lower center, and the road visible through the windshield beyond. Keep the camera static and allow his narrowed brow and fixed forward gaze to carry the tension rather than altering the driving axis.",
            "lighting_mood": "Natural daytime illumination appropriate to the moving car interior is shaped with restrained contrast and neutral color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "moving_car_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior cabin of a modern sedan moving during the daytime. Natural daylight provides restrained and neutral illumination inside the vehicle. The dashboard and front structural elements remain consistent as spatial references.",
                "applies_to_shots": [
                  1,
                  2
                ],
                "element_scope": "full",
                "source_facts": [
                  "실내. 달리는 아반테 - 낮",
                  "Natural daytime illumination appropriate to the moving car interior is shaped with restrained contrast and neutral color.",
                  "dashboard remain as scale references",
                  "Daytime cabin illumination remains restrained"
                ],
                "visual_inferences": [
                  "The front dashboard and spatial framing of the vehicle interior are visible across different camera angles."
                ],
                "creative_decisions": [
                  "Consistent restrained contrast and neutral color palette to maintain the tension and realistic atmosphere of the moving car."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 30,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "405adc5cd9eac84c"
      },
      {
        "scene_index": 34,
        "heading": "실내. 달리는 아반테 - 낮",
        "beat_title": "수십 통의 발신 실패 기록과 증폭되는 초조함",
        "representative_moment": "차량 대시보드 거치대에 놓인 스마트폰 화면에 발신 실패 기록이 빼곡하게 떠 있는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "insert framing at screen height, keeping the phone face square, restrained daytime contrast",
            "t2i_prompt": "Photorealistic cinematic still. A modern smartphone secured in a cradle on a car dashboard, occupying roughly one third of the frame. The illuminated front screen displays a dense digital list of more than ten repeated failed-call entries, receiving sharp local exposure priority. The interior cabin of a moving modern sedan surrounds the device during daytime, with the dark dashboard visible below and around the mount providing a structural scale reference. Natural daylight filters through the cabin with restrained contrast and a neutral color palette, leaving the lower frame open.",
            "outfit_assignments": [],
            "source_facts": [
              "실내. 달리는 아반테 - 낮",
              "핸드폰 통화 연결 목록에는 ‘김지후’ 이름만 십여 개가 넘게 떠 있다.",
              "Daytime cabin illumination remains restrained while the readable phone display receives local exposure priority",
              "the mount and dashboard remain as scale references"
            ],
            "visual_inferences": [
              "fixed_element moving_car_interior: The interior cabin of a modern sedan moving during the daytime",
              "Natural daylight provides restrained and neutral illumination inside the vehicle",
              "The phone-facing cradle is angled toward the driver's seat position"
            ],
            "creative_decisions": [
              "Insert framing focused tightly on the dashboard mount to emphasize the overwhelming number of failed calls without rendering the driver",
              "Neutral color palette applied to the car interior to allow the bright digital interface of the phone screen to stand out"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "2f646708b89f444e",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d4d1c3e60c832fe4",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 34,
        "dependency_reason": "같은 차량 내부 씬의 연장선으로, 대시보드와 차량 내부 자연광의 조명 톤 및 환경 연속성을 유지해야 함",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 34,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "End the inward move slightly beside the mounted phone at screen height, keeping its front face square enough to read while the phone occupies roughly one third of the frame and the mount and dashboard remain as scale references. The repeated failed-call entries for ‘김지후’ run densely down the visible list, with the lower framing left open for the following descent toward the footwell.",
            "lighting_mood": "Daytime cabin illumination remains restrained while the readable phone display receives local exposure priority without inventing an additional source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "moving_car_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior cabin of a modern sedan moving during the daytime. Natural daylight provides restrained and neutral illumination inside the vehicle. The dashboard and front structural elements remain consistent as spatial references.",
                "applies_to_shots": [
                  1,
                  2
                ],
                "element_scope": "full",
                "source_facts": [
                  "실내. 달리는 아반테 - 낮",
                  "Natural daytime illumination appropriate to the moving car interior is shaped with restrained contrast and neutral color.",
                  "dashboard remain as scale references",
                  "Daytime cabin illumination remains restrained"
                ],
                "visual_inferences": [
                  "The front dashboard and spatial framing of the vehicle interior are visible across different camera angles."
                ],
                "creative_decisions": [
                  "Consistent restrained contrast and neutral color palette to maintain the tension and realistic atmosphere of the moving car."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 34,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "fb8597353f5cf597"
      },
      {
        "scene_index": 35,
        "heading": "실외. 금월도 숲속 오솔길 - 낮(수리영의 꿈)",
        "beat_title": "제자리걸음의 무력감",
        "representative_moment": "수리영이 허공에 발을 뜬 달리기 자세로 멀리 선 민숙을 향해 필사적으로 손을 뻗고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide tracking shot, dreamlike natural daytime light with restrained contrast",
            "t2i_prompt": "Photorealistic cinematic still. An unchanged stretch of path dominates the middle-center midground, creating an uncanny gap. Occupying the near left-center, a young Asian woman in casual clothes is captured at a three-quarter angle from the right in mid-stride, her torso pitched forward with one foot suspended above the dirt, reaching one arm forward along the shared path, her hair trailing back in the direction opposite to motion, eyes fixed on the distant figure. Across the same path in the right background, a middle-aged Asian woman stands small at a three-quarter angle from the left, one hand waving her back, eyes fixed on the young woman. The forest environment is bathed in natural daytime light with restrained contrast and subtly uncanny tonal separation, a soft focus enhancing the surreal distance.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: 수리영이 간절한 표정으로 민숙을 향해 한 팔을 뻗은 채, 한쪽 발이 허공에 떠 있는 달리기 중간 자세",
              "Staging Suri-young: three_quarter_right, running with foot suspended, eyes fixed on Min-sook",
              "Staging Min-sook: three_quarter_left, one hand waving her back, eyes fixed on Suri-young",
              "DP instruction: Track beside at eye level, Suri-young near left-center, Min-sook small and distant, natural daytime light with restrained contrast"
            ],
            "visual_inferences": [
              "To convey the suspended motion freeze, the young woman's hair trails back in the direction opposite to motion",
              "The path acts as the required spatial shared anchor separating the foreground running figure and the distant background figure"
            ],
            "creative_decisions": [
              "Wide framing to accommodate both the suspended step of the near figure and the small, distant figure on the upper path in a single shot",
              "Soft focus on the surrounding forest to emphasize the 'uncanny tonal separation' of the dream state"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8e8290afedefe010",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "73c53c7fd0e86235",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "dream",
        "dependent_scene_index": -1,
        "dependency_reason": "No dependent scene specified",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 35,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track beside 김지후(강수리영) at eye level into a medium-full three-quarter frontal view, catching one foot suspended, her torso pitched forward, and one arm reaching toward 강민숙(홍은미) along the path. 김지후(강수리영) occupies the near left-center while 강민숙(홍은미) remains small and distant on the upper path, preserving the dream’s unchanged gap despite the running motion.",
            "lighting_mood": "Natural daytime light is rendered with restrained contrast and subtly uncanny tonal separation appropriate to the dream.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "unchanged stretch of path",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "2b0021153919b957"
      },
      {
        "scene_index": 35,
        "heading": "36. 실외. 금월도 숲속 오솔길 - 낮(수리영의 꿈)",
        "beat_title": "엄마의 섬뜩한 변신",
        "representative_moment": "민숙의 눈동자가 기괴한 황금빛 직사각형으로 변하며 시선을 맞추는 찰나의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level close-up, frontal alignment, high-contrast dream lighting falling away into shadow",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level close-up on the face of an Asian middle-aged woman, facing the camera and looking directly at the camera. Her transformed golden rectangular pupils sit symmetrically across the central close field, serving as a decisive high-contrast accent. Her eyelids, brow, and nose bridge are retained at the frame margins in a direct frontal alignment. The fingertips of a hand frozen mid-warning are partially visible at the lower edge of the frame. Wisps of black smoke begin to dissolve the outer contours of her jawline. The daylight dream tonality falls away into deep, isolating shadow around the face, completely obscuring the surrounding space.",
            "outfit_assignments": [],
            "source_facts": [
              "Min-sook's eyes turn into golden, eerie goat-like rectangular pupils.",
              "Min-sook's body turns into black smoke.",
              "Min-sook is frozen mid-warning, looking at Suri-young in the dream."
            ],
            "visual_inferences": [
              "Due to the close framing scale, only the face and eyes are fully visible, with the warning hand appearing partially at the bottom edge.",
              "The black smoke transformation begins at the edges of her face/jaw.",
              "The background is rendered absent by letting the dream daylight fall into deep shadow."
            ],
            "creative_decisions": [
              "Emphasized the symmetrical placement of the golden rectangular pupils across the central field to create a direct, confronting dream-like tension.",
              "Used deep shadows around the face to comply with the skipped background constraint, isolating the glowing eyes.",
              "Retained the eyelids and nose bridge at the margins to anchor the surreal pupils within a human face."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1862c62a15558384",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "991a21ca12e7b564",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "dream",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on a prior shot since the background is entirely skipped and obscured by shadow in this extreme close-up.",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 35,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the eye-level dolly directly toward 강민숙(홍은미) (꿈속 변형 상태) until the transformed pupils sit symmetrically across the central close field, with eyelids, brow, and the nose bridge retained at the margins. The frontal alignment follows 김지후(강수리영)’s sightline, turning the golden rectangular pupils into a direct dream confrontation.",
            "lighting_mood": "Daylight dream tonality falls away around the face while the explicitly golden rectangular pupils remain the decisive high-contrast accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 35,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "19446db48d09c190"
      },
      {
        "scene_index": 36,
        "heading": "37. 실내. 반월 식당 뒷방 - 낮",
        "beat_title": "가위눌림에서 눈을 번쩍 뜬 수리영",
        "representative_moment": "C01 lies rigid on the bedding with eyes suddenly opened wide, unable to move.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing at bedding height, warm sunlight with restrained interior contrast",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual shirt, a young Korean woman with a pale oval face and long black hair, lies rigidly in the middle-right foreground. Captured from a low angle at bedding height, her supine body is locked stiffly against the neat bedding. Her head is angled to the three-quarter left, eyes suddenly opened wide and looking straight up. Her bare neck is completely exposed above the collar, emphasizing the absence of a necklace. Her immobilized torso extends diagonally across the lower frame. Warm daytime sunlight casts a restrained contrast across her rigid face, gently illuminating the textured fabric of the mattress immediately surrounding her head and shoulders.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "정갈한 뒷방 이불 위에 누운 수리영이 가위에 눌려 눈만 번쩍 뜬 채 몸이 굳어있는 찰나.",
              "창을 타고 따스한 햇살이 스며드는 정갈하게 정돈된 방이다."
            ],
            "visual_inferences": [
              "fixed_element suriyeong_lying_posture: supine posture, bare neck exposed, no necklace",
              "fixed_element tidy_room_sunlight: warm daytime sunlight, persistently calm and serene atmosphere",
              "low camera height emphasizing the rigid body on the bedding"
            ],
            "creative_decisions": [
              "Close framing on the upper body and face to isolate the character's sleep paralysis experience",
              "Diagonal composition in the lower frame to create subtle visual tension against the calm lighting",
              "Omitted background reference due to skipped_close_framing policy, focusing purely on the subject and immediate bedding"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6756366610fd8e8a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "cf9cee46d93150e6",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No prior scene dependency.",
        "_shot_index": 1,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 36,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At bedding height beside 김지후(강수리영), hold the opening position nearly still in a close view angled across her rigid upper body toward her suddenly opened eyes. Her face occupies the upper-right portion and her immobilized torso extends diagonally through the lower frame, with enough bedding visible to establish that she has awakened lying down.",
            "lighting_mood": "Warm sunlight established through the window meets restrained interior contrast, making the room feel unnervingly calm around her rigid face.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_right",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyeong_lying_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young Korean woman is lying supine on the neat bedding. She wears no necklace, leaving her bare neck completely exposed. Her upper body rests against the bedding, indicating she remains in bed without sitting up.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "정갈한 뒷방 이불 위에 누운 수리영",
                  "수리영은 여전히 누운 채 할머니를 쳐다본다.",
                  "버릇처럼 목걸이에 손이 간다. 없다!"
                ],
                "visual_inferences": [
                  "Since she has just awakened and remains in bed, her overall posture is supine, and the absence of the necklace is a continuous state before and after she notices it."
                ],
                "creative_decisions": [
                  "Keeping the bare neck clearly visible without obstruction establishes the absence of the necklace consistently across her upper-body shots."
                ],
                "confidence": "high"
              },
              {
                "element_id": "tidy_room_sunlight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The tidy room is illuminated by warm daytime sunlight streaming through the window. The sunlight creates a persistently calm and serene atmosphere throughout the space, emphasizing the quietness of the room.",
                "applies_to_shots": [
                  1,
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "창을 타고 따스한 햇살이 스며드는 정갈하게 정돈된 방이다.",
                  "모든 게 과하게 평온한 느낌…",
                  "Warm sunlight established through the window"
                ],
                "visual_inferences": [
                  "The lighting remains bright and consistently warm across all angles, providing a steady environmental backdrop."
                ],
                "creative_decisions": [
                  "Maintaining a bright, peaceful, and restrained lighting scheme to highlight the unsettling contrast between the calm reality and her inner confusion."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "9ec3806c81bb7ca1"
      },
      {
        "scene_index": 36,
        "heading": "실내. 반월 식당 뒷방 - 낮",
        "beat_title": "사라진 목걸이를 깨닫는 수리영",
        "representative_moment": "C01이 누운 채 당황한 표정으로 자신의 빈 목을 만진다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing at upper-body height, warm sunlight with restrained contrast",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual top, a young Korean woman in her early 20s with an alarmed expression, is lying supine at three-quarter angle from the right, looking down. Captured from an upper-body height observer perspective, her three-quarter face occupies the upper half of the frame, while her hand is pressed to her bare neck in the lower center. The empty neck is clearly visible between her fingers and the collar area, completely exposed with no necklace. Her upper body rests against [: neat bedding providing a narrow contextual edge at the bottom frame, illuminated by warm daytime sunlight in restrained contrast, maintaining a calm and serene atmosphere].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영은 여전히 누운 채 할머니를 쳐다본다.",
              "버릇처럼 목걸이에 손이 간다. 없다!",
              "창을 타고 따스한 햇살이 스며드는 정갈하게 정돈된 방이다."
            ],
            "visual_inferences": [
              "suriyeong_lying_posture: lying supine on the neat bedding, bare neck completely exposed without the necklace",
              "tidy_room_sunlight: persistently calm and serene atmosphere illuminated by warm daytime sunlight"
            ],
            "creative_decisions": [
              "Framing restricted to close upper-body scale to isolate the alarmed face and the hand on the bare neck",
              "Replaced the forbidden L01 ID with L02 for the background bedding surface",
              "Bedding restricted to a narrow contextual edge at the bottom to maintain focus on the character's realization"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "3e180c4c977c320d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "07f12704b0bffb9f",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 36,
        "dependency_reason": "S36_Shot1의 정갈한 방과 햇살 조명, 그리고 수리영의 누운 자세(fixed_elements) 연속성 유지",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 36,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Settle the inward move beside 김지후(강수리영) at upper-body height, framing her alarmed three-quarter face in the upper half and her hand stopped against the bare neck in the lower center. Keep the empty neck clearly visible between her fingers and collar area while the bedding remains a narrow contextual edge rather than shifting attention to the room.",
            "lighting_mood": "The established warm window sunlight is held in restrained contrast, revealing the empty neck and alarmed expression without adding another source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyeong_lying_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young Korean woman is lying supine on the neat bedding. She wears no necklace, leaving her bare neck completely exposed. Her upper body rests against the bedding, indicating she remains in bed without sitting up.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "정갈한 뒷방 이불 위에 누운 수리영",
                  "수리영은 여전히 누운 채 할머니를 쳐다본다.",
                  "버릇처럼 목걸이에 손이 간다. 없다!"
                ],
                "visual_inferences": [
                  "Since she has just awakened and remains in bed, her overall posture is supine, and the absence of the necklace is a continuous state before and after she notices it."
                ],
                "creative_decisions": [
                  "Keeping the bare neck clearly visible without obstruction establishes the absence of the necklace consistently across her upper-body shots."
                ],
                "confidence": "high"
              },
              {
                "element_id": "tidy_room_sunlight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The tidy room is illuminated by warm daytime sunlight streaming through the window. The sunlight creates a persistently calm and serene atmosphere throughout the space, emphasizing the quietness of the room.",
                "applies_to_shots": [
                  1,
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "창을 타고 따스한 햇살이 스며드는 정갈하게 정돈된 방이다.",
                  "모든 게 과하게 평온한 느낌…",
                  "Warm sunlight established through the window"
                ],
                "visual_inferences": [
                  "The lighting remains bright and consistently warm across all angles, providing a steady environmental backdrop."
                ],
                "creative_decisions": [
                  "Maintaining a bright, peaceful, and restrained lighting scheme to highlight the unsettling contrast between the calm reality and her inner confusion."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 36,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "e5dee58279d68b3b"
      },
      {
        "scene_index": 36,
        "heading": "실내. 반월 식당 뒷방 - 낮",
        "beat_title": "기괴하게 평온한 아침 인사",
        "representative_moment": "수리영의 누운 시점에서, 반쯤 열린 미닫이문을 한 손으로 잡고 카메라를 향해 활짝 웃고 있는 노인의 모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "subjective low-angle POV, medium framing with restrained contrast",
            "t2i_prompt": "Photorealistic cinematic still. A partly opened sliding door frames an elderly Asian woman with white hair in the middle-center midground, the remaining doorway panel forming a strong vertical edge. Viewed from a low resting eye level on the floor, the lower frame is occupied by the floor surface leading to the threshold, while the woman's torso and head extend toward the upper edge. She stands at a three-quarter angle from the right, one hand gripping the door edge, leaning gently into the opening. She is looking at the camera with a broad, subtly unsettling smile. The tidy room behind the door is illuminated by warm daytime sunlight streaming in, creating a persistently calm and serene atmosphere held against restrained shadow contrast.",
            "outfit_assignments": [],
            "source_facts": [
              "드르륵- 방문을 열고 활짝 웃는 영란.",
              "수리영은 여전히 누운 채 할머니를 쳐다본다.",
              "그져 가만히 웃고 있는 할머니 시선만 피할 수 없이 마주할 뿐이다."
            ],
            "visual_inferences": [
              "fixed_element tidy_room_sunlight: warm daytime sunlight and calm atmosphere preserved",
              "Subjective POV implies camera is positioned low, at the eye level of someone lying on the floor"
            ],
            "creative_decisions": [
              "Low camera angle emphasizing the power dynamic and subjective viewpoint",
              "Restrained contrast to visually separate the warm sunlight from the unsettling nature of the smile"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "704048ea8301c617",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "273aa8777b7c650c",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 36,
        "dependency_reason": "exact_background from prior shot (S36_Shot4) to maintain the tidy room sunlight consistency",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 36,
            "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 김지후(강수리영)’s low resting eye height, finish the lateral track with the partly opened sliding door enclosing 강영란(흰 머리 여자) near center-right and the remaining doorway panel forming a strong vertical edge. 강영란(흰 머리 여자) holds the door with one hand and leans gently into the opening, smiling directly toward 김지후(강수리영)’s viewpoint.",
            "lighting_mood": "Established daytime sunlight gives the tidy room a warm calmness, held against restrained contrast that leaves the smile subtly unsettling.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "partly opened sliding door framing 강영란(흰 머리 여자)",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "tidy_room_sunlight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The tidy room is illuminated by warm daytime sunlight streaming through the window. The sunlight creates a persistently calm and serene atmosphere throughout the space, emphasizing the quietness of the room.",
                "applies_to_shots": [
                  1,
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "창을 타고 따스한 햇살이 스며드는 정갈하게 정돈된 방이다.",
                  "모든 게 과하게 평온한 느낌…",
                  "Warm sunlight established through the window"
                ],
                "visual_inferences": [
                  "The lighting remains bright and consistently warm across all angles, providing a steady environmental backdrop."
                ],
                "creative_decisions": [
                  "Maintaining a bright, peaceful, and restrained lighting scheme to highlight the unsettling contrast between the calm reality and her inner confusion."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 36,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "b77d9539e060dce6"
      },
      {
        "scene_index": 37,
        "heading": "38. 실외. 반월 식당 뒤뜰 - 낮",
        "beat_title": "사라진 제단 터",
        "representative_moment": "C01은 굳게 닫혔던 창고 문을 열고 평범한 식당 물품만 가득한 안쪽을 보며 미간을 찌푸리고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level close profile shot, framing the character's face on the right half against the doorway edge",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a Korean young woman, seen in left profile with her face occupying the right half of the close frame. She leans slightly forward, her knitted brow and arrested posture prominent as her eyes fix off-screen onto an empty gap where the altar should be. [: The open front of the doorway faces the camera at an oblique angle, closely framing her profile, while the left background reveals a soft-focus glimpse of the ordinary storage interior piled with mundane restaurant supplies and fishing gear]. The scene is illuminated by natural daylight, rendered with restrained contrast and a subdued, earthy color palette devoid of comforting warmth.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "shot description: profile of Kim Ji-hoo with a knitted brow, looking at the vanished altar trace",
              "S38 action: she opens the storage door, finding only restaurant and fishing supplies inside"
            ],
            "visual_inferences": [
              "fixed_element yard_daylight_environment: outdoor yard illuminated by natural daylight, restrained contrast, subdued earthy color",
              "The background interior is kept in soft focus due to close framing, emphasizing her facial expression."
            ],
            "creative_decisions": [
              "Positioned the character's face on the right half of the frame, allowing the left half to show the mundane supplies that contradict her expectations.",
              "Employed a subdued, earthy color palette to maintain the bleak, tense atmosphere despite the daytime setting."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "anchor ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing gear rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light bulb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "supply rack",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "539814e2ac43473c",
              "owned_hash": "51c310ad3be9acd5",
              "camera_direction_hash": "eb9411be5f5f538e",
              "owned_usage_hash": "c72a27ee3d43edc1",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency required for this isolated character reaction shot.",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 37,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level beside 김지후(강수리영), the tracking arc settles into a close profile at the open storage doorway, with her face occupying the right half and the ordinary storage interior remaining legible behind her on the left. Her knitted brow and arrested forward lean hold the frame while the empty area where she expected the altar stays within her sightline, preparing the pivot toward the off-screen voice.",
            "lighting_mood": "Natural daylight appropriate to the yard is rendered with restrained contrast and subdued earthy color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L30B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "yard_daylight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor yard is illuminated by natural daylight. The environment features a restrained contrast with a subdued, neutral, and earthy color palette, deliberately devoid of comforting warmth.",
                "applies_to_shots": [
                  4,
                  5,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daylight appropriate to the yard",
                  "restrained contrast and subdued earthy color",
                  "restrained neutral palette",
                  "leaving the palette subdued rather than comforting"
                ],
                "visual_inferences": [
                  "The lighting reflects a tense and bleak atmosphere despite being an outdoor daytime setting."
                ],
                "creative_decisions": [
                  "Using restrained environmental contrast and subdued tones to amplify the uncomfortable dynamic in the yard."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "c9deb97c24ca756d"
      },
      {
        "scene_index": 37,
        "heading": "실외. 반월 식당 뒤뜰 - 낮",
        "beat_title": "영란의 감시",
        "representative_moment": "C06 stands at the restaurant rear door, gazing off-screen across the yard.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide full-body shot across the yard, firm daylight contrast",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level wide shot from near the storage doorway, looking across the outdoor yard. C06O07 in a subdued traditional modified hanbok, an elderly Korean woman in her late 60s, stands slightly off-center, braced within the restaurant rear door. She is seen at three-quarter angle from the left, her full body visible from head to shoes. Her elegant elderly face with neatly tied white hair shows a stiff expression, eyes fixed off-screen. The open storage doorway occupies the foreground edge of the composition. The physical separation of the wide yard creates spatial tension. The environment is illuminated by natural daylight with firm contrast, defined by a subdued, earthy, and neutral color palette completely devoid of comforting warmth.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O07"
              }
            ],
            "source_facts": [
              "영란이 식당 뒷문에 서서 수리영을 보고 있다",
              "Natural daylight appropriate to the yard",
              "restrained contrast and subdued earthy color"
            ],
            "visual_inferences": [
              "fixed_element youngran_white_hair: C06's neatly tied white hair remains a prominent demographic identifier",
              "fixed_element yard_daylight_environment: daylight across the yard with a restrained neutral palette",
              "C06's full body visible from head to shoes consistent with eye-level wide framing"
            ],
            "creative_decisions": [
              "Wide framing across the yard emphasizes the spatial distance and uncomfortable span between the observer's position and C06",
              "Using subdued earthy colors to amplify the tense atmosphere despite the daylight setting"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "anchor ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "braced within the restaurant rear door"
              },
              {
                "owned_token": "fishing gear rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light bulb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "supply rack",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8d9e7bf2bc9ccf84",
              "owned_hash": "51c310ad3be9acd5",
              "camera_direction_hash": "0519f839e86d0c2b",
              "owned_usage_hash": "3c810bdbf8671a4d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "braced within the restaurant rear door",
                  "reason": "The prompt mentions the door and storage doorway only for camera composition and character positioning, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 37,
        "dependency_reason": "exact_background: same room, new moment/angle. Background carries through from the prior shot's established yard environment.",
        "_shot_index": 5,
        "visible_entities": [
          "C06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 37,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From eye level near the storage doorway, the pan finishes across the yard in a wide full-body reveal of 강영란(흰 머리 여자) at the restaurant rear doorway. She is held slightly off-center within the doorway while the open yard creates an uncomfortable span between her and the unseen 김지후(강수리영), leaving lateral space for the next move onto their dialogue axis.",
            "lighting_mood": "Daylight across the yard is treated with firm contrast and a restrained neutral palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O07"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L30B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "anchor ring",
              "door",
              "fishing gear rack",
              "light bulb",
              "shelf",
              "supply rack"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "youngran_white_hair",
                "element_type": "character_state",
                "character_name": "강영란(흰 머리 여자)",
                "description": "The woman has distinct white hair. This physical trait remains continuously visible, serving as a key demographic identifier whether she is seen from a distance or just as a trace at the edge of the frame.",
                "applies_to_shots": [
                  5,
                  10
                ],
                "element_scope": "close",
                "source_facts": [
                  "흰 머리 여자",
                  "trace of white hair at the near frame edge"
                ],
                "visual_inferences": [
                  "Her white hair is a prominent feature that easily identifies her even when only partially in frame."
                ],
                "creative_decisions": [
                  "Keeping the white hair visible as an over-the-shoulder trace in close-ups to maintain her looming presence."
                ],
                "confidence": "high"
              },
              {
                "element_id": "yard_daylight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor yard is illuminated by natural daylight. The environment features a restrained contrast with a subdued, neutral, and earthy color palette, deliberately devoid of comforting warmth.",
                "applies_to_shots": [
                  4,
                  5,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daylight appropriate to the yard",
                  "restrained contrast and subdued earthy color",
                  "restrained neutral palette",
                  "leaving the palette subdued rather than comforting"
                ],
                "visual_inferences": [
                  "The lighting reflects a tense and bleak atmosphere despite being an outdoor daytime setting."
                ],
                "creative_decisions": [
                  "Using restrained environmental contrast and subdued tones to amplify the uncomfortable dynamic in the yard."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 37,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C06O07",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L30B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "456ec24f479d38f6"
      },
      {
        "scene_index": 37,
        "heading": "38. 실외. 반월 식당 뒤뜰 - 낮",
        "beat_title": "Overwhelmed by a piercing warning",
        "representative_moment": "Suriyoung freezes in place, completely overwhelmed by Youngran's piercing gaze.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight over-the-shoulder composition, natural daylight with restrained facial contrast",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a pale Korean woman in her early 20s, caught at a three-quarter angle from the right, her shoulders locked mid-retreat and her frozen face expressing overwhelmed tension. She shares the tight space near the doorway, her eyes fixed on the elderly Asian woman in front of her. The elderly woman leans subtly toward her, appearing only as an out-of-focus shoulder and a trace of distinct white hair at the near foreground edge in an over-the-shoulder perspective. The frame is illuminated by natural daylight shaped into restrained facial contrast, maintaining a subdued, earthy color palette deliberately devoid of comforting warmth. [: blurred oblique portion of an open warehouse entrance, providing minimal soft yard context directly behind the primary subject].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "김지후(강수리영): three_quarter_right, shoulders locked mid-retreat, frozen face expressing tension",
              "강영란: over_shoulder, leaning subtly toward Suriyoung",
              "Natural daylight, restrained contrast and subdued earthy color palette"
            ],
            "visual_inferences": [
              "fixed_element youngran_white_hair: distinct white hair visible as a key demographic identifier at the frame edge",
              "fixed_element yard_daylight_environment: subdued, neutral, and earthy color palette devoid of comforting warmth"
            ],
            "creative_decisions": [
              "Used a tight over-the-shoulder framing to emphasize the intense psychological pressure on Suriyoung's frozen face",
              "Kept the warehouse entrance blurred and oblique in the background to ensure the primary subject remains the sole focus in close framing"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "anchor ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing gear rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light bulb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelf",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "supply rack",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "099ed555e89d24db",
              "owned_hash": "51c310ad3be9acd5",
              "camera_direction_hash": "2451291f57dc00d6",
              "owned_usage_hash": "c72a27ee3d43edc1",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 37,
        "dependency_reason": "Maintains consistency with the yard environment and the white hair trait from previous shots.",
        "_shot_index": 10,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 37,
            "shot_index": 10
          },
          "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 from near 강영란(흰 머리 여자)'s side of the eyeline, the dolly-in ends on a tight three-quarter close-up of Suriyoung's frozen face. Youngran remains only as a soft shoulder and trace of white hair at the near frame edge, while Suriyoung occupies most of the opposite side with no room to retreat visually.",
            "lighting_mood": "Natural daylight is shaped into restrained facial contrast, leaving the palette subdued rather than comforting.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L30B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "youngran_white_hair",
                "element_type": "character_state",
                "character_name": "강영란(흰 머리 여자)",
                "description": "The woman has distinct white hair. This physical trait remains continuously visible, serving as a key demographic identifier whether she is seen from a distance or just as a trace at the edge of the frame.",
                "applies_to_shots": [
                  5,
                  10
                ],
                "element_scope": "close",
                "source_facts": [
                  "흰 머리 여자",
                  "trace of white hair at the near frame edge"
                ],
                "visual_inferences": [
                  "Her white hair is a prominent feature that easily identifies her even when only partially in frame."
                ],
                "creative_decisions": [
                  "Keeping the white hair visible as an over-the-shoulder trace in close-ups to maintain her looming presence."
                ],
                "confidence": "high"
              },
              {
                "element_id": "yard_daylight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor yard is illuminated by natural daylight. The environment features a restrained contrast with a subdued, neutral, and earthy color palette, deliberately devoid of comforting warmth.",
                "applies_to_shots": [
                  4,
                  5,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daylight appropriate to the yard",
                  "restrained contrast and subdued earthy color",
                  "restrained neutral palette",
                  "leaving the palette subdued rather than comforting"
                ],
                "visual_inferences": [
                  "The lighting reflects a tense and bleak atmosphere despite being an outdoor daytime setting."
                ],
                "creative_decisions": [
                  "Using restrained environmental contrast and subdued tones to amplify the uncomfortable dynamic in the yard."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 37,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "9f1108d730dc41e6"
      },
      {
        "scene_index": 38,
        "heading": "실외. 선척장 - 낮",
        "beat_title": "새끼줄 장식을 고정하는 황 씨",
        "representative_moment": "황 씨가 낚시 어선 뱃머리에서 종이 인형이 달린 새끼줄을 양손으로 쥔 채 고정하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height framing, natural daytime light with muted earthy tonality",
            "t2i_prompt": "Photorealistic cinematic still. An elderly East Asian man in worn fisher workwear, seen at three-quarter angle from the right, stands at the bow of a moored fishing boat, looking down as he braces a thick rope with both hands. His working arms form a shallow diagonal across the center of the frame. The rope is strung with various human-shaped paper figures hanging beneath it. Captured at chest height on the pier beside the bow, the man's torso and arms occupy the frame, while the boat's hull and the paper figures remain proportionate environmental context. Natural daytime light casts a muted earthy tonality with restrained contrast across the outdoor waterfront environment.",
            "outfit_assignments": [],
            "source_facts": [
              "S39 action: 정박한 낚시 어선에 새끼줄 장식을 달고 있는 황 씨.",
              "shot description: 황봉업(황 씨)이 낚시 어선 뱃머리에서 기괴한 종이 인형들이 매달린 새끼줄을 양손으로 쥔 채 고정하고 있는 모습.",
              "lighting: Natural daytime light is presented with restrained contrast and muted earthy tonality."
            ],
            "visual_inferences": [
              "fixed_element pier_daytime_environment: The scene takes place on an outdoor waterfront pier under natural daytime lighting.",
              "The man's fisher workwear matches his occupation and the coastal setting.",
              "The paper figures create an uncanny graphic rhythm beneath his hands."
            ],
            "creative_decisions": [
              "Chest-height framing effectively captures the torso, arms, and the physical action of securing the rope without cropping the essential context of the boat's bow.",
              "Muted earthy tonality reinforces the subtly tense and ordinary daytime atmosphere outlined in the continuity elements."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "buoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dock light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "anchor",
                "source_phrase": "a moored fishing boat"
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring line",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "on the pier beside the bow"
              },
              {
                "owned_token": "rope",
                "usage_kind": "redraw",
                "source_phrase": "braces a thick rope with both hands"
              },
              {
                "owned_token": "utility shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "winch",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e45892379e28a8ca",
              "owned_hash": "e65531e26a480bfc",
              "camera_direction_hash": "557851a75b8c5152",
              "owned_usage_hash": "e7c5ccf196be8c2f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "fishing boat",
                  "violating_phrase": "a moored fishing boat",
                  "reason": "The fishing boat is used only as a spatial anchor to specify the character's location, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pier",
                  "violating_phrase": "on the pier beside the bow",
                  "reason": "The pier serves solely as a camera viewpoint reference and is not altered or redrawn.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "rope",
                  "violating_phrase": "braces a thick rope with both hands",
                  "reason": "The physical interaction of bracing the rope with both hands is explicitly required by the shot intent to show the character holding the rope, satisfying the prop contact exception.",
                  "verdict": "allowed_prop_contact"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "동일한 선착장 배경(L23B01)의 이전 샷(씬 27 샷 2) 환경과 시각적 일관성 유지",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 38,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height on the dock beside the bow, a static medium view faces inward toward 황봉업(황 씨) as he fixes the rope decoration with both hands. His working arms form a shallow diagonal across the center, while the bow and the hanging paper figures remain proportionate environmental context rather than oversized foreground objects.",
            "lighting_mood": "Natural daytime light is presented with restrained contrast and muted earthy tonality.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "buoy",
              "cabin",
              "dock light",
              "fender",
              "fish crate",
              "fishing boat",
              "fishing net",
              "flag",
              "gangway",
              "mast",
              "mooring line",
              "pier",
              "rope",
              "utility shed",
              "winch"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_daytime_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene takes place on an outdoor waterfront pier under natural daytime lighting. The illumination is characterized by muted earthy tonality and restrained contrast, creating an ordinary but subtly tense daylight atmosphere across the docks.",
                "applies_to_shots": [
                  1,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 선척장 - 낮",
                  "Natural daytime light is presented with restrained contrast and muted earthy tonality. (Shot 1)",
                  "Natural daylight keeps the smiles plainly readable while restrained contrast preserves the uncanny tension. (Shot 7)"
                ],
                "visual_inferences": [
                  "The background consists of a typical fishing dock area, consistently lit by overcast or slightly muted daytime sunlight without harsh shadows."
                ],
                "creative_decisions": [
                  "Maintaining a consistent muted and earthy color palette across the environment to ground the uncanny character interactions in a highly realistic setting."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L23B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "e9f011d551e69ae6"
      },
      {
        "scene_index": 38,
        "heading": "39. 실외. 선척장 - 낮",
        "beat_title": "살인마 청년들의 평범하고 친근한 인사와 수리영의 인지 부조화",
        "representative_moment": "수리영의 어깨 너머로, 친근하게 미소 지으며 다가오는 두 마을 청년의 모습이 보이는 미디엄 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium two-shot from an over-the-shoulder perspective with natural daylight and restrained contrast.",
            "t2i_prompt": "Photorealistic cinematic still. Shot over the hunched left shoulder of a Korean young woman in the lower foreground, her back to the camera as she steps backward in a defensive recoil. Across the shared wooden pier, two Korean young men in fisher workwear occupy the opposite halves of the midground. The man on the left stands at three-quarter angle from the left, leaning forward mid-greeting with an open smile, eyes fixed on the woman. The man on the right stands at three-quarter angle from the right, weight shifting toward her with a warm smile, eyes fixed on the woman. The pier recedes behind the young men toward the background. The pier-facing side of a moored fishing boat is partially visible in the background. Muted natural daylight with restrained contrast and earthy tonality illuminates the scene, keeping the men's friendly faces plainly readable against the subtly tense atmosphere.",
            "outfit_assignments": [],
            "source_facts": [
              "S38 action: The two young men approach Suriyoung and greet her with friendly smiles.",
              "S38 action: Suriyoung is terrified and steps backward.",
              "shot description: medium two-shot of the two villagers, preserving Suriyoung's eyeline with the edge of her retreating shoulder in the foreground."
            ],
            "visual_inferences": [
              "fixed_element pier_daytime_environment: outdoor waterfront pier under muted natural daytime lighting.",
              "The men lean toward the woman across the shared pier to emphasize the psychological contrast between their friendly greeting and her fear."
            ],
            "creative_decisions": [
              "Placed the woman's shoulder low in the foreground to anchor the defensive recoil and establish the POV.",
              "Maintained a muted, earthy color palette with soft daylight to contrast the cheerful smiles with the underlying uncanny tension."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "buoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dock light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "anchor",
                "source_phrase": "The pier-facing side of a moored fishing boat is partially visible"
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring line",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "Across the shared wooden pier"
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "winch",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8a1841a09c4759c1",
              "owned_hash": "e65531e26a480bfc",
              "camera_direction_hash": "a05e994fad4d7ff3",
              "owned_usage_hash": "5c401e80d276f4d8",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "pier",
                  "violating_phrase": "Across the shared wooden pier",
                  "reason": "The pier is referenced as a spatial anchor for the characters' positions and recedes into the background, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fishing boat",
                  "violating_phrase": "The pier-facing side of a moored fishing boat is partially visible in the background",
                  "reason": "The fishing boat is mentioned solely as a partially visible background element to establish context, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 29,
        "dependency_reason": "동일한 선착장 배경 공간 및 조명 분위기 연속성(exact_background) 유지",
        "_shot_index": 7,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 38,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The track settles at 김지후(강수리영)'s eye level into a medium two-shot of the two 금월도 마을 청년, preserving her eyeline with the edge of her retreating shoulder low in the foreground. The young men occupy opposite halves of the midground and lean toward her with open smiles, making their ordinary friendliness visually clash with her defensive recoil.",
            "lighting_mood": "Natural daylight keeps the smiles plainly readable while restrained contrast preserves the uncanny tension.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "buoy",
              "cabin",
              "dock light",
              "fender",
              "fish crate",
              "fishing boat",
              "fishing net",
              "flag",
              "gangway",
              "mast",
              "mooring line",
              "pier",
              "rope",
              "utility shed",
              "winch"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_daytime_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene takes place on an outdoor waterfront pier under natural daytime lighting. The illumination is characterized by muted earthy tonality and restrained contrast, creating an ordinary but subtly tense daylight atmosphere across the docks.",
                "applies_to_shots": [
                  1,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 선척장 - 낮",
                  "Natural daytime light is presented with restrained contrast and muted earthy tonality. (Shot 1)",
                  "Natural daylight keeps the smiles plainly readable while restrained contrast preserves the uncanny tension. (Shot 7)"
                ],
                "visual_inferences": [
                  "The background consists of a typical fishing dock area, consistently lit by overcast or slightly muted daytime sunlight without harsh shadows."
                ],
                "creative_decisions": [
                  "Maintaining a consistent muted and earthy color palette across the environment to ground the uncanny character interactions in a highly realistic setting."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 29,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L23B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "680cd4ae933e97e5"
      },
      {
        "scene_index": 39,
        "heading": "실외. 금월도 해안 마을 일각 - 낮",
        "beat_title": "역한 냄새에 찌푸린 얼굴",
        "representative_moment": "역한 냄새를 맡은 C01이 손으로 코를 막은 채 미간을 잔뜩 찌푸리며 시선을 아래로 향한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close three-quarter view from the left, crisp natural daylight contrast on the face",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in modern casual wear, a young East Asian woman, seen at three-quarter angle from the left, her face and one hand occupying most of the frame. Her fingers clamp tightly over her nose, tightly furrowed brow, and compressed mouth, eyes looking down. [: A narrow out-of-focus soft strip of a rustic village road and partial house fronts visible directly behind her]. Crisp natural daytime daylight illuminates her facial features with distinct high-contrast shadows against the subdued, restrained color palette of the environment.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영은 대답 대신 쓴웃음만 짓는다. 그러다 코를 찌르는 역한 냄새에 인상을 팍 쓴다.",
              "낮 시간, 금월도 해안 마을 길"
            ],
            "visual_inferences": [
              "fixed_element village_natural_daylight: Crisp natural daytime daylight illuminates the outdoor island village environment.",
              "Shallow depth of field effectively isolates her visceral physical reaction from the surrounding environment."
            ],
            "creative_decisions": [
              "Kept the framing extremely tight on her hand and facial expression to instantly convey the sensory shock of the smell, pushing the village elements to a soft backdrop."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5ead928578fafc54",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "8624e0d101d4c57d",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "동일한 마을 길 배경의 톤과 조명을 유지하되, 현재 샷은 클로즈업 렌즈로 인해 배경이 아웃포커싱 처리됨",
        "_shot_index": 3,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 39,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level directly ahead and slightly off-axis, the dolly-in ends on a close three-quarter view emphasizing 김지후(강수리영)'s pinched nose, tightly furrowed brow, and compressed mouth without excluding the hand causing the gesture. Her face and hand take most of the frame, with only a narrow strip of the village road retained as spatial context.",
            "lighting_mood": "Natural daytime illumination is rendered with crisp facial contrast and restrained color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyoung_base_appearance",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A modern woman walking through an unfamiliar rural island village. Her overall physical appearance, hairstyle, and daytime attire remain visually consistent throughout the sequence. This consistent baseline persists even as her specific gestures and body language change in response to the environment.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "김지후(강수리영) appears across multiple shots exploring the village.",
                  "She reacts to smells and village residents while moving through the area."
                ],
                "visual_inferences": [
                  "Her clothing is likely modern casual wear, contrasting with the rustic island setting.",
                  "Her hairstyle and makeup remain intact and consistent during this continuous daytime walk."
                ],
                "creative_decisions": [
                  "Established a unified base character design to anchor her identity across various emotional and physical reactions."
                ],
                "confidence": "medium"
              },
              {
                "element_id": "village_natural_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Crisp natural daytime daylight illuminates the outdoor island village environment. The lighting maintains a restrained, somewhat subdued color palette with distinct high-contrast tonality across the rustic surroundings.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 해안 마을 일각 - 낮",
                  "Natural daytime illumination is rendered with crisp facial contrast and restrained color.",
                  "overall palette remains subdued.",
                  "restrained, high-contrast tonality."
                ],
                "visual_inferences": [
                  "The light casts distinct natural shadows that emphasize the textures of the rural environment and the characters' faces."
                ],
                "creative_decisions": [
                  "Unified the outdoor sequence with a specific color grading that feels both natural and slightly unsettling due to the subdued tones."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "d56bc5e3dc883b72"
      },
      {
        "scene_index": 39,
        "heading": "실외. 금월도 해안 마을 일각 - 낮",
        "beat_title": "마을 곳곳에 놓인 녹색 석창포를 발견함",
        "representative_moment": "마을 길을 걷던 C01이 집집마다 놓인 무성한 녹색 석창포 다발들을 멍하니 응시하며 걸음을 멈춘다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide composition at eye level, crisp natural daylight with subdued palette",
            "t2i_prompt": "Photorealistic cinematic still. Captured at eye level diagonally ahead in a wide composition, the dirt village road occupies the lower frame. On one side, C01O01 in a casual outfit, a young Korean woman with long black hair and a pale complexion, stands at three-quarter angle from the right. She is halted with her front foot planted on the ground, looking off-screen with her eyes fixed on the abundant green seokchangpo plant clusters distributed around the nearby houses across the rest of the frame. Several rustic house fronts and entrance areas face the road at varying oblique angles, framing her halted route. Crisp natural daytime daylight illuminates the outdoor island village environment, casting distinct shadows that clearly separate the figure from the repeated green plants, while maintaining a restrained, subdued color palette with high-contrast tonality.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "김지후(강수리영) appears across multiple shots exploring the village.",
              "집집마다 민숙의 집에서 키웠던 바로 그 녹색풀이 한가득이다.",
              "Natural daytime illumination is rendered with crisp facial contrast and restrained color.",
              "overall palette remains subdued."
            ],
            "visual_inferences": [
              "suriyoung_base_appearance",
              "village_natural_daylight",
              "The dirt road and traditional rustic house fronts visually anchor the village setting.",
              "Her halted step highlights her sudden realization of the widespread plants."
            ],
            "creative_decisions": [
              "Placed C01O01 on one side of the wide frame to emphasize the sheer volume of green plants filling the rest of the environment.",
              "Used an eye-level wide angle to firmly ground her within the village layout and show the road beneath her feet."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "fe45923ae3182987",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "1ef96776ebf6fb86",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 39,
        "dependency_reason": "앞선 샷과 동일한 실외 마을 환경 및 주간 자연광 톤 연속성 유지",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 39,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level diagonally ahead of 김지후(강수리영), the dolly-out resolves into a wide composition that holds her stopped figure on one side and abundant green seokchangpo clusters around the nearby houses across the rest of the frame. Her arrested step is sustained rather than completed, and her gaze travels across multiple clusters so their repetition becomes the visual discovery.",
            "lighting_mood": "Natural daylight clearly separates Suriyoung from the repeated green plants while the overall palette remains subdued.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyoung_base_appearance",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A modern woman walking through an unfamiliar rural island village. Her overall physical appearance, hairstyle, and daytime attire remain visually consistent throughout the sequence. This consistent baseline persists even as her specific gestures and body language change in response to the environment.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "김지후(강수리영) appears across multiple shots exploring the village.",
                  "She reacts to smells and village residents while moving through the area."
                ],
                "visual_inferences": [
                  "Her clothing is likely modern casual wear, contrasting with the rustic island setting.",
                  "Her hairstyle and makeup remain intact and consistent during this continuous daytime walk."
                ],
                "creative_decisions": [
                  "Established a unified base character design to anchor her identity across various emotional and physical reactions."
                ],
                "confidence": "medium"
              },
              {
                "element_id": "village_natural_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Crisp natural daytime daylight illuminates the outdoor island village environment. The lighting maintains a restrained, somewhat subdued color palette with distinct high-contrast tonality across the rustic surroundings.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 해안 마을 일각 - 낮",
                  "Natural daytime illumination is rendered with crisp facial contrast and restrained color.",
                  "overall palette remains subdued.",
                  "restrained, high-contrast tonality."
                ],
                "visual_inferences": [
                  "The light casts distinct natural shadows that emphasize the textures of the rural environment and the characters' faces."
                ],
                "creative_decisions": [
                  "Unified the outdoor sequence with a specific color grading that feels both natural and slightly unsettling due to the subdued tones."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 39,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "fbb3c267c56b9428"
      },
      {
        "scene_index": 39,
        "heading": "실외. 금월도 해안 마을 일각 - 낮",
        "beat_title": "마을 사람들의 기이하고 압도적인 시선 집중",
        "representative_moment": "Suriyoung, seen from behind in the foreground, shrinks defensively as C25 and a group of villagers lean over a low stone wall, staring at her in unison.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At eye level from the protagonist's side of the wall, an over-the-shoulder medium-wide reverse angle with crisp natural daylight and high-contrast, subdued tonality.",
            "t2i_prompt": "Photorealistic cinematic still. A low stone wall spans the lower-center midground, serving as a shared spatial anchor. In the near foreground, the back of an East Asian woman in modern daytime attire is seen in over-the-shoulder framing; she is drawing her shoulders inward defensively, looking off-screen. Just beyond the wall, a unified horizontal band of East Asian villagers leans together over the stones, facing the camera with their eyes fixed on the woman. Among them is C25O28 in fisher workwear, an East Asian man in his 20s, matching the collective posture by leaning over the wall, facing the camera with his eyes fixed on the woman. The fronts of rustic island houses sit in the background behind the residents, facing generally toward the road. Crisp natural daytime daylight illuminates the outdoor environment, casting a restrained, high-contrast tonality that keeps every watching face legible against the rustic surroundings.",
            "outfit_assignments": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "source_facts": [
              "어느새 야트막한 담 너머로 마을 사람들이 전부 수리영을 내다보는 것 같다.",
              "도망가듯 서둘러 자리를 벗어나려는데, (방어적으로 움츠러든 상태)"
            ],
            "visual_inferences": [
              "fixed_element village_natural_daylight: crisp daytime illumination with high-contrast tonality and a subdued palette.",
              "fixed_element suriyoung_base_appearance: modern woman in consistent daytime attire.",
              "The villagers form a horizontal band behind the wall, emphasizing their synchronized, unsettling public attention."
            ],
            "creative_decisions": [
              "Positioned the low stone wall across the lower-center to geometrically separate the protagonist from the villagers.",
              "Utilized an over-the-shoulder framing from the woman's perspective to highlight her isolation and the oppressive gaze of the residents."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1b53f08223997c9f",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "46c0c92f6b4128c4",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 39,
        "dependency_reason": "Same continuous outdoor island environment and daytime lighting conditions as established in the prior S39_Shot5.",
        "_shot_index": 7,
        "visible_entities": [
          "C25"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 39,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level from 김지후(강수리영)'s side of the low wall, a static medium-wide reverse angle arranges the 금월도 마을 주민 as a unified horizontal band, their heads and upper bodies rising just beyond the wall. Suriyoung's shoulder and turned head remain small in the near foreground, while the wall defines the lower compositional edge and makes the residents' synchronized attention feel like a public display.",
            "lighting_mood": "Natural daytime light keeps every watching face legible within restrained, high-contrast tonality.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "낮은 돌담",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C25"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyoung_base_appearance",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A modern woman walking through an unfamiliar rural island village. Her overall physical appearance, hairstyle, and daytime attire remain visually consistent throughout the sequence. This consistent baseline persists even as her specific gestures and body language change in response to the environment.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "김지후(강수리영) appears across multiple shots exploring the village.",
                  "She reacts to smells and village residents while moving through the area."
                ],
                "visual_inferences": [
                  "Her clothing is likely modern casual wear, contrasting with the rustic island setting.",
                  "Her hairstyle and makeup remain intact and consistent during this continuous daytime walk."
                ],
                "creative_decisions": [
                  "Established a unified base character design to anchor her identity across various emotional and physical reactions."
                ],
                "confidence": "medium"
              },
              {
                "element_id": "village_natural_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Crisp natural daytime daylight illuminates the outdoor island village environment. The lighting maintains a restrained, somewhat subdued color palette with distinct high-contrast tonality across the rustic surroundings.",
                "applies_to_shots": [
                  3,
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 해안 마을 일각 - 낮",
                  "Natural daytime illumination is rendered with crisp facial contrast and restrained color.",
                  "overall palette remains subdued.",
                  "restrained, high-contrast tonality."
                ],
                "visual_inferences": [
                  "The light casts distinct natural shadows that emphasize the textures of the rural environment and the characters' faces."
                ],
                "creative_decisions": [
                  "Unified the outdoor sequence with a specific color grading that feels both natural and slightly unsettling due to the subdued tones."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 39,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C25O28",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "74daeb5750b6e2a8"
      },
      {
        "scene_index": 40,
        "heading": "실외. 숲속 입구 - 낮",
        "beat_title": "어둠이 깔린 숲 입구 앞에서의 주저",
        "representative_moment": "C01O01 stands rigidly at the bright threshold of the dark forest path, viewed from behind.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide view from standing height behind the character, striking natural daylight-to-darkness contrast",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a young Korean woman, stands in the lower-center midground with her back to the camera, looking off-screen toward the forest path entrance and continuing trail in the upper-center background. Captured from a standing height behind her, her feet are firmly planted at the exact threshold where a narrow dirt path meets the dense woods. Her posture remains stiffly upright, radiating extreme tension and hesitation. The clearing around her is bathed in clear midday daylight, but the interior of the overgrown forest ahead is abruptly shrouded in deep, void-like darkness. This stark natural lighting contrast distinctly marks the boundary between the safe, brightly lit exterior and the ominous depths, as the heavy canopy completely blocks the sunlight from penetrating the woods.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S41 action: 수리영이 숲으로 통하는 오솔길 입구에 서 있다.",
              "S41 environment: 숲 저쪽은 한낮인데도 빛이 닿지 않는 듯 어둑하기만 하다.",
              "Shot description: 대낮임에도 불구하고 어둠이 짙게 깔린 숲길 오솔길 입구 앞에 우두커니 선 김지후(강수리영)의 뒷모습."
            ],
            "visual_inferences": [
              "fixed_element suriyoung_standing_at_threshold: feet firmly planted, stiffly upright posture viewed from behind.",
              "fixed_element dark_forest_entrance_contrast: clear midday daylight abruptly transitioning into heavy, impenetrable darkness inside the forest."
            ],
            "creative_decisions": [
              "Positioning C01 in the lower-center midground to anchor the viewer's perspective and placing the dark path in the upper-center background to emphasize the ominous threshold.",
              "Using stark natural lighting contrast to build a void-like atmosphere inside the woods without artificial light sources."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "3ab5ff2a157dc403",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "69b9c748fbfbbfa8",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 23,
        "dependency_reason": "Same location (dark forest entrance) established in S23_Shot1.",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 40,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From standing height several meters behind 김지후(강수리영), the dolly-in begins on a centered wide view aligned with her back and the forest path entrance. Her full figure occupies the lower center while the path continues beyond her into the darker interior, turning her stillness into a threshold she has not yet crossed.",
            "lighting_mood": "Daylight at the entrance falls away into the explicitly dark forest interior, creating strong natural contrast without an added source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "숲 오솔길 입구와 이어지는 길",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김지후(강수리영)",
                  "screen_zone": "lower_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "L19"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyoung_standing_at_threshold",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young Korean woman stands rigidly at the exact threshold where a brightly lit clearing meets a dark forest trail. Her feet are firmly planted on the ground, showing extreme hesitation and tension. Her posture remains stiffly upright, viewed from behind or at a slight rear angle, as she stares fixedly into the gloomy depths of the woods ahead.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "수리영이 숲으로 통하는 오솔길 입구에 서 있다.",
                  "feet fixed at path threshold",
                  "rigid three-quarter back in the foreground"
                ],
                "visual_inferences": [
                  "Her posture is very stiff to reflect the intense fear and hesitation described in the text.",
                  "She is wearing modern casual clothing suitable for a young woman in a rural setting."
                ],
                "creative_decisions": [
                  "Positioning her consistently in the foreground with her back towards the camera to emphasize her point of view facing the unknown darkness."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_forest_entrance_contrast",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A narrow dirt path serves as the threshold into a dense, overgrown forest. While the entrance itself is bathed in clear midday daylight, the interior of the woods is abruptly shrouded in deep, heavy darkness as if sunlight cannot penetrate the canopy. This stark natural lighting contrast distinctly marks the boundary between the safe, brightly lit exterior and the ominous forest depths.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "숲 저쪽은 한낮인데도 빛이 닿지 않는 듯 어둑하기만 하다.",
                  "Daylight at the entrance falls away into the explicitly dark forest interior"
                ],
                "visual_inferences": [
                  "The transition from bright daylight to darkness happens rapidly along the path.",
                  "Thick trees and heavy foliage loom over the path to justify the lack of light."
                ],
                "creative_decisions": [
                  "Using natural contrast without artificial lighting sources to create a threatening and unnatural void-like darkness within the forest."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 23,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "70303faabc1cbfe8"
      },
      {
        "scene_index": 40,
        "heading": "실외. 숲속 입구 - 낮",
        "beat_title": "숲으로 유혹하는 짐승과의 기괴한 대치",
        "representative_moment": "오솔길 입구에 선 C01이 숲속 어둠 속에서 자신을 응시하는 대형 검은 염소와 대치하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level side angle, wide layered composition with stark daylight-to-darkness contrast.",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a young pale Korean woman with long black hair, stands in the middle-left foreground, looking toward a large black goat in the woods, with the narrow dirt path between the two figures extending into the middle-center midground. Captured from an eye-level side angle, her rigid body is seen from behind at a three-quarter angle from the right, her feet firmly planted on the brightly lit threshold, her posture leaning imperceptibly toward the path in extreme tension. Deeper along the shared dirt path, the large black goat stands at a three-quarter angle from the left, its forelegs planted firmly, its eyes fixed on C01O01. An unobstructed diagonal eyeline connects them across the empty space. The entrance is bathed in clear midday daylight, contrasting sharply against the deep, heavy darkness covering the dense forest canopy around the goat, creating a restrained, ominous tonal range.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영이 숲으로 통하는 오솔길 입구에 서 있다.",
              "숲 저쪽은 한낮인데도 빛이 닿지 않는 듯 어둑하기만 하다.",
              "검은 염소 한 마리가 숲속에서 수리영을 지긋이 바라본다.",
              "feet fixed at path threshold",
              "rigid three-quarter back in the foreground"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: rigid three-quarter back, leaning imperceptibly toward the path",
              "fixed_element dark_forest_entrance_contrast: rapid transition from daylight to deep forest shadow",
              "goat positioned deeper in the path facing her, emphasizing the silent invitation into the woods"
            ],
            "creative_decisions": [
              "Wide layered composition separating the brightly lit foreground and the dark midground forest.",
              "Unobstructed diagonal eyeline to emphasize the psychological tension between the young woman and the goat across the shared path."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "4e5c8e63356bfe88",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "dbcc5e3cce6b8d53",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 40,
        "dependency_reason": "previous_shot_refs (scene_index: 40, shot_index: 1) requires exact_background consistency for the forest trail entrance.",
        "_shot_index": 8,
        "visible_entities": [
          "C01",
          "L19"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 40,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level off 김지후(강수리영)'s side, the lateral track ends in a wide layered view with her rigid three-quarter back in the foreground and 수리영을 공격한 대형 검은 염소 deeper along the path. Both figures are held on opposite sides of the frame with an unobstructed diagonal eyeline between them, making the empty path space read as a silent invitation rather than separating coverage.",
            "lighting_mood": "Daylight near Suriyoung contrasts with the scene-specified darkness deeper in the forest, holding both figures in a restrained, ominous tonal range.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "두 피사체 사이의 오솔길",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "숲속의 대형 검은 염소",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_left",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "L19"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyoung_standing_at_threshold",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young Korean woman stands rigidly at the exact threshold where a brightly lit clearing meets a dark forest trail. Her feet are firmly planted on the ground, showing extreme hesitation and tension. Her posture remains stiffly upright, viewed from behind or at a slight rear angle, as she stares fixedly into the gloomy depths of the woods ahead.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "수리영이 숲으로 통하는 오솔길 입구에 서 있다.",
                  "feet fixed at path threshold",
                  "rigid three-quarter back in the foreground"
                ],
                "visual_inferences": [
                  "Her posture is very stiff to reflect the intense fear and hesitation described in the text.",
                  "She is wearing modern casual clothing suitable for a young woman in a rural setting."
                ],
                "creative_decisions": [
                  "Positioning her consistently in the foreground with her back towards the camera to emphasize her point of view facing the unknown darkness."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_forest_entrance_contrast",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A narrow dirt path serves as the threshold into a dense, overgrown forest. While the entrance itself is bathed in clear midday daylight, the interior of the woods is abruptly shrouded in deep, heavy darkness as if sunlight cannot penetrate the canopy. This stark natural lighting contrast distinctly marks the boundary between the safe, brightly lit exterior and the ominous forest depths.",
                "applies_to_shots": [
                  1,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "숲 저쪽은 한낮인데도 빛이 닿지 않는 듯 어둑하기만 하다.",
                  "Daylight at the entrance falls away into the explicitly dark forest interior"
                ],
                "visual_inferences": [
                  "The transition from bright daylight to darkness happens rapidly along the path.",
                  "Thick trees and heavy foliage loom over the path to justify the lack of light."
                ],
                "creative_decisions": [
                  "Using natural contrast without artificial lighting sources to create a threatening and unnatural void-like darkness within the forest."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 40,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "6327389b4cdf5bf0"
      },
      {
        "scene_index": 41,
        "heading": "실외. 숲속 - 잠시 후",
        "beat_title": "역겨운 냄새의 근원",
        "representative_moment": "숲속 비석 앞에 놓인 썩은 고기를 발견한 C01이 고개를 숙인 채 역겨움에 미간을 찌푸린다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "shoulder-height tight framing with high-contrast ambient forest lighting",
            "t2i_prompt": "Photorealistic cinematic still. Seen from a close shoulder-height vantage point just in front and slightly beside her, C01O01 in a dark casual jacket, an Asian woman in her early 20s with long black hair and a pale youthful face, is leaning forward mid-breath at three-quarter angle from the left. She is looking down with a deeply furrowed brow in disgust. Her face and neck occupy the upper-center and right of the frame. Beneath her lowered eyeline at the bottom edge of the frame, a restrained, out-of-focus sliver of a moss-covered stone marker and dark rotten meat is partially visible. Restrained, high-contrast ambient forest illumination catches the tension on her features, isolating her strained expression against [: closely packed, layered sea pine tree trunks and thick undergrowth wrapped in deep shadow].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S42 action: 수리영이 고기 썩은내에 인상을 팍 찌푸린다.",
              "shot description: 역겨운 냄새에 미간을 팍 찌푸리며 썩은 고기를 내려다보는 김지후(강수리영)의 얼굴.",
              "비석 앞에는 어김없이 썩은 육고기가 놓여있다."
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: leaning forward mid-breath",
              "fixed_element dense_pine_forest: closely packed, layered tree trunks in soft focus"
            ],
            "creative_decisions": [
              "Positioned the face in the upper-center and right to allow the lower frame edge to reveal the source of disgust without overwhelming the composition.",
              "Used high-contrast lighting to accentuate the furrows in her brow and the visceral reaction."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6dc7a06eab82d1f9",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "abffd7abedee9aa8",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on a prior scene specified.",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 41,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From shoulder height just in front of and slightly beside 김지후(강수리영), the dolly-in settles into a tight three-quarter face close-up while preserving her lowered eyeline. Her face occupies the upper-center and right of frame, with a restrained sliver of the stone marker and rotten meat remaining below as the cause of her disgust.",
            "lighting_mood": "Restrained, high-contrast ambient forest illumination keeps her tightened brow and strained breathing visually prominent without specifying an unconfirmed source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dense_pine_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is a dense sea pine forest filled with closely packed, layered tree trunks and thick undergrowth. Restrained, low-key ambient lighting filters through the dense canopy, creating a moody, high-contrast atmosphere throughout the woods.",
                "applies_to_shots": [
                  4,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "빽빽한 해송 나무 숲",
                  "나무 와 나무 사이 수풀",
                  "Restrained, high-contrast ambient forest illumination",
                  "Low-key ambient forest illumination isolates the clawed silhouette and trunk edge"
                ],
                "visual_inferences": [
                  "The sea pine trees have dark, heavily textured bark that stands out in the high-contrast lighting.",
                  "The thick undergrowth casts deep shadows, limiting visibility between the trunks."
                ],
                "creative_decisions": [
                  "Maintained a consistent gloomy and confined lighting scheme to visually connect the character's tight framing with the sudden, ominous appearance of the beast."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "a8ee363fdf70c2d0"
      },
      {
        "scene_index": 41,
        "heading": "42. 실외. 숲속 - 잠시 후",
        "beat_title": "정체를 알 수 없는 짐승의 위협",
        "representative_moment": "빽빽한 해송 기둥 뒤로 날카로운 발톱을 가진 짐승의 털 덮인 손이 불쑥 튀어나온 찰나의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing at chest height with low-key ambient forest illumination and shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. Close framing at chest height in a dense forest. The sharp, clawed, black-furred hand of C28O00, a dark beast, hooks tightly into view from behind the side edge of a heavily textured pine tree trunk. The unseen figure remains concealed behind the wood, state alive, with its gaze directed off-screen. The fur-covered hand occupies less than the central third of the frame, held in sharp focus. The near side edge of the trunk forms a hard vertical reveal line in the foreground. Behind the hand, overlapping tree trunks and thick undergrowth recede into a soft, out-of-focus background. Restrained, low-key ambient illumination filters through the canopy, isolating the clawed silhouette and the trunk's bark edge with moody, high-contrast shadows.",
            "outfit_assignments": [
              {
                "character_id": "C28",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "S41 action: '나무 뒤로 스윽 사라지는 날카로운 짐승의 손.'",
              "shot description: 빽빽한 나무 기둥 뒤로 짐승의 털이 난 날카로운 손이 튀어나온 찰나의 클로즈업."
            ],
            "visual_inferences": [
              "fixed_element dense_pine_forest: The environment is a dense sea pine forest filled with closely packed, layered tree trunks and thick undergrowth.",
              "The hand is hooked around the vertical side edge of the trunk at chest height, creating spatial tension."
            ],
            "creative_decisions": [
              "Used a close framing scale to isolate the primary subject (the clawed hand) and the immediate frame-edge surface (the trunk).",
              "Applied a shallow depth of field to render the background thick undergrowth soft and out-of-focus, matching the skipped background reference policy.",
              "Omitted the [L01] block entirely per the user's modification request, blending the background description naturally into the text."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a510d8572129882d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "967ecbcc39aeb660",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 41,
        "dependency_reason": "Same Geumwol Island dense pine forest environment from the previous shot.",
        "_shot_index": 7,
        "visible_entities": [
          "C28"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 41,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height among the trees, the lateral track stops flush with the side edge of a trunk as the fur-covered hand hooks briefly into view from behind it. The hand occupies less than the central third, held in sharp focus against layered tree trunks and undergrowth so its sudden appearance remains spatially credible.",
            "lighting_mood": "Low-key ambient forest illumination isolates the clawed silhouette and trunk edge with restrained contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C28"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C28",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dense_pine_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is a dense sea pine forest filled with closely packed, layered tree trunks and thick undergrowth. Restrained, low-key ambient lighting filters through the dense canopy, creating a moody, high-contrast atmosphere throughout the woods.",
                "applies_to_shots": [
                  4,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "빽빽한 해송 나무 숲",
                  "나무 와 나무 사이 수풀",
                  "Restrained, high-contrast ambient forest illumination",
                  "Low-key ambient forest illumination isolates the clawed silhouette and trunk edge"
                ],
                "visual_inferences": [
                  "The sea pine trees have dark, heavily textured bark that stands out in the high-contrast lighting.",
                  "The thick undergrowth casts deep shadows, limiting visibility between the trunks."
                ],
                "creative_decisions": [
                  "Maintained a consistent gloomy and confined lighting scheme to visually connect the character's tight framing with the sudden, ominous appearance of the beast."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 41,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "045d8fdaca5886cf"
      },
      {
        "scene_index": 42,
        "heading": "43. 실외. 국도변 주유소 - 낮",
        "beat_title": "국도변 주유소 전경",
        "representative_moment": "A wide view of an older model sedan parked next to a fuel pump at a daytime gas station.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static eye-level wide view with bright daytime ambient light and restrained contrast",
            "t2i_prompt": "Photorealistic cinematic still. A static eye-level wide view looking across the open forecourt of an outdoor gas station, focusing on an older model compact sedan and an adjacent fuel pump held together as the scene's spatial anchor. The sedan is parked stationary across the middle of the frame, its broad exterior side and partial end facing the camera. The fuel pump stands beside the vehicle, its operational face angled toward the car. The open concrete forecourt extends along a shallow diagonal around the vehicle. The environment is illuminated by bright daytime ambient light diffusing evenly across the area, providing clear visibility of the wide fueling area with restrained contrast and no harsh shadows.",
            "outfit_assignments": [],
            "source_facts": [
              "Bright daytime ambient light clearly describes the vehicle, pump, and open fueling area with restrained contrast.",
              "국도변 주유소 - 낮",
              "주유기 옆에 서 있는 아반테."
            ],
            "visual_inferences": [
              "fixed_element gas_station_daytime_lighting: The natural daylight is consistent and diffuses evenly across the forecourt, ensuring no harsh shadows obscure the view.",
              "fixed_element parked_older_sedan: The car remains turned off and stationary exactly next to the pump during the entire sequence."
            ],
            "creative_decisions": [
              "Placed the car across the middle of the frame to serve as a clear spatial anchor and scale reference for the fueling area.",
              "Utilized a shallow diagonal composition for the open forecourt to create depth in the wide view."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "67031fe190499df5",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "2a7560f2f3df0be0",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 34,
        "dependency_reason": "previous_shot_refs location continuity for consistent gas station atmosphere",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 42,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static eye-level wide view looks across the fueling area, holding the parked 구형 아반테 and adjacent fuel pump together as the scene's spatial anchor. The car sits across the middle of frame with the pump beside it, leaving open forecourt space along the shallow diagonal that the next camera move will follow.",
            "lighting_mood": "Bright daytime ambient light clearly describes the vehicle, pump, and open fueling area with restrained contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "gas_station_daytime_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor gas station environment is illuminated by bright daytime ambient light. The natural lighting provides clear visibility with restrained contrast, maintaining a consistent atmosphere whether viewing the wide fueling area or the immediate surroundings of the vehicle.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "Bright daytime ambient light clearly describes the vehicle, pump, and open fueling area with restrained contrast.",
                  "Bright daytime ambient light is balanced so the active phone display remains legible",
                  "국도변 주유소 - 낮"
                ],
                "visual_inferences": [
                  "The natural daylight is consistent and diffuses evenly across the forecourt, ensuring no harsh shadows obscure the view."
                ],
                "creative_decisions": [
                  "Restrained contrast is used to maintain a balanced exposure, ensuring visibility of both wide spatial elements and digital screen details without inventing additional illumination."
                ],
                "confidence": "high"
              },
              {
                "element_id": "parked_older_sedan",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "An older model compact sedan is parked stationary beside a fuel pump. The vehicle remains in the exact same position throughout the sequence, acting as the clear spatial anchor in the wide view and providing the immediate physical context in closer framing.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "구형 아반테",
                  "holding the parked 구형 아반테 and adjacent fuel pump together as the scene's spatial anchor",
                  "softly resolved vehicle context preserve scale"
                ],
                "visual_inferences": [
                  "The car remains turned off and stationary exactly next to the pump during the entire sequence."
                ],
                "creative_decisions": [
                  "The car acts as the central visual and spatial anchor, cleanly framing the wide shot while providing essential depth and scale context for the over-the-shoulder close-up."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 34,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "69e3e69d95df1760"
      },
      {
        "scene_index": 42,
        "heading": "43. 실외. 국도변 주유소 - 낮",
        "beat_title": "확인된 외딴 섬의 위치",
        "representative_moment": "손끝에 들린 P10 화면에 다른 섬들과 뚝 떨어진 외딴 섬이 지도 앱으로 선명하게 표시된다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "over-the-shoulder insert framing, downward tilt, bright daytime ambient with shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. Insert framing from a downward over-the-shoulder angle. A P10 smartphone is held squarely in the center of the frame by the partial fingertips of an Asian man. The active digital screen occupies under forty percent of the image, displaying a map interface with a cluster of landmasses and one distinctly isolated island separated from the rest. The background is softly resolved with a shallow depth of field, revealing the blurred exterior edge of a parked older compact sedan at an outdoor gas station. Bright daytime ambient light diffuses evenly across the environment, balanced perfectly so the phone's dynamic touchscreen remains sharply legible.",
            "outfit_assignments": [],
            "source_facts": [
              "핸드폰 지도앱 화면: 다른 여러 개의 섬에서 뚝 떨어진 외딴 섬.",
              "Bright daytime ambient light is balanced so the active phone display remains legible",
              "An older model compact sedan is parked stationary beside a fuel pump."
            ],
            "visual_inferences": [
              "fixed_element parked_older_sedan: acts as a softly resolved spatial background context for the insert framing without breaking focus from the device.",
              "Fingertips holding the device are partially visible to preserve realistic scale without revealing the character's full body."
            ],
            "creative_decisions": [
              "Shallow depth of field explicitly isolates the P10 smartphone screen while keeping the gas station environment recognizable but unobtrusive.",
              "A direct, square-on angle to the phone's face avoids perspective distortion on the map interface."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "45b434af9bb05b47",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "e0e89791054ad762",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 42,
        "dependency_reason": "이전 샷의 주유소 공간과 주차된 구형 아반테 차량의 배경 연속성 유지 (softly resolved frame context)",
        "_shot_index": 4,
        "visible_entities": [
          "P10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 42,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From just above and behind 정인우's shoulder line, the completed downward tilt isolates the phone's front face in the center, square enough for the map text to read without perspective distortion. The screen remains under forty percent of the image, while partial fingers and softly resolved vehicle context preserve scale; the isolated island marked “금월도” sits clearly apart from the surrounding islands.",
            "lighting_mood": "Bright daytime ambient light is balanced so the active phone display remains legible without inventing additional illumination.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "P10"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "gas_station_daytime_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor gas station environment is illuminated by bright daytime ambient light. The natural lighting provides clear visibility with restrained contrast, maintaining a consistent atmosphere whether viewing the wide fueling area or the immediate surroundings of the vehicle.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "Bright daytime ambient light clearly describes the vehicle, pump, and open fueling area with restrained contrast.",
                  "Bright daytime ambient light is balanced so the active phone display remains legible",
                  "국도변 주유소 - 낮"
                ],
                "visual_inferences": [
                  "The natural daylight is consistent and diffuses evenly across the forecourt, ensuring no harsh shadows obscure the view."
                ],
                "creative_decisions": [
                  "Restrained contrast is used to maintain a balanced exposure, ensuring visibility of both wide spatial elements and digital screen details without inventing additional illumination."
                ],
                "confidence": "high"
              },
              {
                "element_id": "parked_older_sedan",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "An older model compact sedan is parked stationary beside a fuel pump. The vehicle remains in the exact same position throughout the sequence, acting as the clear spatial anchor in the wide view and providing the immediate physical context in closer framing.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "구형 아반테",
                  "holding the parked 구형 아반테 and adjacent fuel pump together as the scene's spatial anchor",
                  "softly resolved vehicle context preserve scale"
                ],
                "visual_inferences": [
                  "The car remains turned off and stationary exactly next to the pump during the entire sequence."
                ],
                "creative_decisions": [
                  "The car acts as the central visual and spatial anchor, cleanly framing the wide shot while providing essential depth and scale context for the over-the-shoulder close-up."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 42,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "97734279f2bff8d9"
      },
      {
        "scene_index": 43,
        "heading": "44. 실외. 다시 숲속 - 낮",
        "beat_title": "자신의 이름이 새겨진 무덤 비석 발견",
        "representative_moment": "거친 바위 표면에 '수 리 영'이라는 세 글자가 선명하게 음각된 찰나의 비석 인서트.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Knee-height square insert composition, high-contrast restrained forest daylight",
            "t2i_prompt": "Photorealistic cinematic still. A rough, moss-covered stone marker occupies the central portion of the frame, viewed directly from knee height. The uneven, weathered face of the stone features three distinct, deeply engraved Korean characters reading '수 리 영', centered and fully legible. Narrow margins of the rough stone and thick moss surround the text, establishing it as an old tombstone. Faint details of the shadowy forest floor are visible at the very edges of the frame. Restrained daytime ambient light filters through a dense canopy above, casting muted but high-contrast shadows that sharply define the clean, pale engraving against the dark crevices of the stone.",
            "outfit_assignments": [],
            "source_facts": [
              "바위에 쓰인 글자는 바로 “수 리 영”",
              "이정표 같은 이끼 낀 비석",
              "거친 바위 표면에 '수 리 영'이라는 세 글자가 선명하게 음각된 찰나의 클로즈업 (Shot 5)",
              "Daytime ambient forest light provides enough restrained contrast (Shot 5)"
            ],
            "visual_inferences": [
              "fixed_element engraved_stone_marker: rough, moss-covered stone marker with distinct Korean characters deeply engraved",
              "fixed_element forest_daylight: Restrained daytime ambient lighting filtered through a dense forest canopy",
              "The deep engraving stands out sharply against the dark moss and weathered stone under the muted forest ambient light."
            ],
            "creative_decisions": [
              "Tight insert framing square to the stone face to maximize the legibility and shocking impact of the engraved name.",
              "High-contrast lighting on the rough surface to emphasize the unnatural clarity of the text against the overgrown moss without needing direct sunlight."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "05d2519b925068f5",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "1741fa0226846746",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 43,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At knee height and square to the marker's inscribed face, the forward move settles into a brief locked insert with all three engraved characters centered and fully legible. The inscription occupies the central portion of frame while narrow margins of the rough stone face and moss establish that the text belongs physically to the marker.",
            "lighting_mood": "Daytime ambient forest light provides enough restrained contrast for the engraved characters and uneven stone face to read clearly.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "engraved_stone_marker",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A rough, moss-covered stone marker situated in a dense forest. Its uneven, weathered surface features three distinct Korean characters deeply engraved into the stone face, resembling an old tombstone.",
                "applies_to_shots": [
                  5,
                  6
                ],
                "element_scope": "close",
                "source_facts": [
                  "이정표 같은 이끼 낀 비석",
                  "바위에 쓰인 글자는 바로 “수 리 영”",
                  "거친 바위 표면에 '수 리 영'이라는 세 글자가 선명하게 음각된 찰나의 클로즈업 (Shot 5)",
                  "soft fragment of the marker remains low in frame (Shot 6)"
                ],
                "visual_inferences": [
                  "The moss grows closely around the crevices of the rough stone, making the sharp, clean engraving of the name stand out unnaturally against the weathered texture."
                ],
                "creative_decisions": [
                  "Framing the marker as a grounded, low-positioned object to emphasize its eerie resemblance to a forgotten grave marker."
                ],
                "confidence": "high"
              },
              {
                "element_id": "forest_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Restrained daytime ambient lighting filtered through a dense forest canopy. The light is bright enough to read clear details but maintains a muted, shadowy atmosphere with high contrast, devoid of harsh direct sunlight.",
                "applies_to_shots": [
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 다시 숲속 - 낮",
                  "Daytime ambient forest light provides enough restrained contrast (Shot 5)",
                  "Daytime forest ambience falls into high facial contrast (Shot 6)"
                ],
                "visual_inferences": [
                  "The thick overhead foliage blocks direct sunbeams, casting an oppressive, slightly cold daylight tone that heightens the psychological tension."
                ],
                "creative_decisions": [
                  "Utilizing the subdued natural lighting of the deep woods to naturally emphasize the pale, stark contrast of both the stone engraving and the character's terrified face."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "122372b1d7b6e09d"
      },
      {
        "scene_index": 43,
        "heading": "44. 실외. 다시 숲속 - 낮",
        "beat_title": "자신의 이름이 새겨진 비석 앞에서 굳어버린 수리영",
        "representative_moment": "A tight close-up of a Korean young woman staring down in pale terror, with an out-of-focus mossy stone marker fragment in the lower frame.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight close-up at eye level, high facial contrast under restrained forest daylight",
            "t2i_prompt": "Photorealistic cinematic still. A Korean young woman, facing the camera and frozen over bent knees, looking down. Her pale face, gripped by rigid fear, occupies the center in a tight close-up. A soft, out-of-focus fragment of a rough, moss-covered stone marker remains visible at the lower frame edge. Restrained daytime ambient lighting filtered through a dense forest canopy creates high facial contrast, casting deep shadows across her terrified expression. [: Muted, shadowy forest background with softly receding tree sides and vegetation completely out of focus].",
            "outfit_assignments": [],
            "source_facts": [
              "거친 바위 표면에 '수 리 영'이라는 세 글자가 선명하게 음각된 찰나의 클로즈업 (Shot 5)",
              "soft fragment of the marker remains low in frame (Shot 6)",
              "Daytime forest ambience falls into high facial contrast (Shot 6)"
            ],
            "visual_inferences": [
              "The moss grows closely around the crevices of the rough stone",
              "The thick overhead foliage blocks direct sunbeams, casting an oppressive, slightly cold daylight tone"
            ],
            "creative_decisions": [
              "Tight close-up framing heavily restricts the view to emphasize psychological terror over the physical environment",
              "Replaced L01 with L02 as requested, maintaining a soft, defocused background to satisfy close framing skip policy"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "baae433d61125f64",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "446bc6f35f8f23df",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 43,
        "dependency_reason": "Close-up reaction shot maintaining the same forest lighting and stone marker elements established in the previous shot (Shot 5).",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 43,
            "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 crane rise from the inscription settles at eye level directly opposite 김지후(강수리영), holding a tight close-up as recognition arrests her expression. Her face occupies most of the center while a soft fragment of the marker remains low in frame, preserving the source of her terror without shifting her downward gaze.",
            "lighting_mood": "Daytime forest ambience falls into high facial contrast, emphasizing her pallor and rigid fear without introducing an additional source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "engraved_stone_marker",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A rough, moss-covered stone marker situated in a dense forest. Its uneven, weathered surface features three distinct Korean characters deeply engraved into the stone face, resembling an old tombstone.",
                "applies_to_shots": [
                  5,
                  6
                ],
                "element_scope": "close",
                "source_facts": [
                  "이정표 같은 이끼 낀 비석",
                  "바위에 쓰인 글자는 바로 “수 리 영”",
                  "거친 바위 표면에 '수 리 영'이라는 세 글자가 선명하게 음각된 찰나의 클로즈업 (Shot 5)",
                  "soft fragment of the marker remains low in frame (Shot 6)"
                ],
                "visual_inferences": [
                  "The moss grows closely around the crevices of the rough stone, making the sharp, clean engraving of the name stand out unnaturally against the weathered texture."
                ],
                "creative_decisions": [
                  "Framing the marker as a grounded, low-positioned object to emphasize its eerie resemblance to a forgotten grave marker."
                ],
                "confidence": "high"
              },
              {
                "element_id": "forest_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Restrained daytime ambient lighting filtered through a dense forest canopy. The light is bright enough to read clear details but maintains a muted, shadowy atmosphere with high contrast, devoid of harsh direct sunlight.",
                "applies_to_shots": [
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 다시 숲속 - 낮",
                  "Daytime ambient forest light provides enough restrained contrast (Shot 5)",
                  "Daytime forest ambience falls into high facial contrast (Shot 6)"
                ],
                "visual_inferences": [
                  "The thick overhead foliage blocks direct sunbeams, casting an oppressive, slightly cold daylight tone that heightens the psychological tension."
                ],
                "creative_decisions": [
                  "Utilizing the subdued natural lighting of the deep woods to naturally emphasize the pale, stark contrast of both the stone engraving and the character's terrified face."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 43,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "1fe266a6aa1eec92"
      },
      {
        "scene_index": 44,
        "heading": "45. 실내. 도축장 - 낮",
        "beat_title": "섬뜩한 도축장의 전경",
        "representative_moment": "깨진 창문으로 스며든 한낮 햇빛이 핏자국 가득한 바닥과 금속 걸개를 비추는 적막하고 섬뜩한 풍경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "High, wide diagonal angle with high-contrast stark midday sunlight against deep shadows",
            "t2i_prompt": "Photorealistic cinematic still. From a high, wide position near one side of the room, looking diagonally across a desolate slaughterhouse interior. A broken window sits high on one side, its oblique opening letting in stark midday sunlight that cuts through the deep ambient shadow. The floor and walls are scattered with visible bloodstains, illuminated by the bright diagonal shafts. Distributed throughout the foreground, middle distance, and background, metallic hanging hooks and butcher knives are visible, their curved sides and sharp blades catching harsh highlights from the incoming sun. The camera focuses on the chilling atmosphere of the blood-marked floor and the gleaming metal equipment stretching across the wide composition, without any single object overwhelming the room.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot 1: 깨진 창문으로 스며든 햇빛이 핏자국 가득한 도축장 바닥과 고기 걸개를 섬뜩하게 비추는 전경.",
              "S45 action: 깨진 창으로 스며드는 한낮 햇살에 바닥과 벽, 곳곳에 핏자국들이 더욱 선명해 보인다. 서슬퍼런 칼과 고기 걸이 금속 걸개들도 빛을 받아 섬뜩하게 반짝인다."
            ],
            "visual_inferences": [
              "fixed_element slaughterhouse_environment: The broken window consistently dictates the lighting direction and high contrast across the entire scene.",
              "The high diagonal view emphasizes the scale of the room and the distribution of bloodstains and equipment without any characters present."
            ],
            "creative_decisions": [
              "Use a high, wide diagonal angle to capture the full scope of the slaughterhouse without allowing any single object to overwhelm the frame.",
              "Employ high-contrast lighting with deep shadows and stark midday sunlight to enhance the gruesome, chilling tone of the location."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "dd51459111d94283",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "2b09d888d3c27431",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 42,
        "dependency_reason": "exact_background: 같은 도축장 배경의 공간적 연속성 유지",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 44,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a high, wide position near one side of the room, the camera looks diagonally across the full slaughterhouse interior and begins its downward survey along the blood-marked floor toward the hanging equipment. The broken window sits high on one side, while the floor, walls, knives, and hooks are distributed through foreground, middle distance, and background rather than allowing any single object to overwhelm the room.",
            "lighting_mood": "Midday sunlight entering through the broken window cuts across the bloodstained interior, producing stark highlights on the knives and hanging hooks against deep shadow.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "slaughterhouse_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the slaughterhouse features a broken window situated high on one side, serving as the primary source of stark midday sunlight. The floor and walls are scattered with visible bloodstains, while metallic hanging hooks and equipment remain in the surrounding space, reflecting harsh highlights from the sun.",
                "applies_to_shots": [
                  1,
                  6,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "깨진 창으로 스며드는 한낮 햇살에 바닥과 벽, 곳곳에 핏자국들",
                  "Midday sunlight entering through the broken window cuts across the bloodstained interior",
                  "Established midday sunlight from the broken window"
                ],
                "visual_inferences": [
                  "The broken window consistently dictates the lighting direction and high contrast across the entire scene."
                ],
                "creative_decisions": [
                  "Use the harsh sunlight and prominent bloodstains to emphasize the gruesome and chilling nature of the location."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 42,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "690e43a8fa8b0ec3"
      },
      {
        "scene_index": 44,
        "heading": "실내. 도축장 - 낮",
        "beat_title": "강영란의 무자비한 심판 직전, 서늘한 손길",
        "representative_moment": "엎드린 청년의 머리 위에 부드럽게 손을 얹은 강영란의 모습에서 기괴한 긴장감이 흐르는 찰나.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At shoulder height beside the nearest bowed youth, three-quarter framing with stark midday sunlight and hard separation",
            "t2i_prompt": "Photorealistic cinematic still. At shoulder height beside a prostrate figure, the camera captures an older Asian woman and a young Asian man sharing the same bloodstained slaughterhouse floor. The woman is distinguished by her stark pale, white hair, positioned at a three-quarter angle from the right and bending into the upper-left of the frame, her eyes fixed on the youth below her. The young Asian man is folded in the lower-right with his back to the camera, prostrate and looking down. The woman's relaxed palm rests gently on his head, serving as the compositional hinge between them. In the darker background, other prostrate figures remain secondary and lower in the room. The interior of the slaughterhouse features a broken window situated obliquely high on one side, serving as the primary source of stark midday sunlight. The floor and walls are scattered with visible bloodstains, while sparse metallic hanging hooks and equipment remain in the surrounding space, reflecting harsh highlights. The prominent physical trait of the woman's white hair and her resting hand consistently catch the bright midday sunlight entering the room, creating a hard separation that stands out vividly against the otherwise dim and deeply shadowed interior.",
            "outfit_assignments": [],
            "source_facts": [
              "영란은 그 청년의 머리를 쓰다듬으며 뒤로 돌아간다 (쓰다듬기 시작하는 순간)",
              "마을 청년들이 바들바들 떨며 납작 엎드려 있음",
              "깨진 창으로 스며드는 한낮 햇살, 곳곳에 핏자국들, 금속 걸개들"
            ],
            "visual_inferences": [
              "fixed_element yeong_ran_pale_hair: white hair acts as a natural reflector for the harsh sunlight, separating her from the dark interior",
              "fixed_element slaughterhouse_environment: broken window dictates lighting direction and high contrast",
              "Her resting palm acts as the compositional hinge between the dominant woman in the upper-left and the submissive youth in the lower-right"
            ],
            "creative_decisions": [
              "Position the woman leaning into the upper-left and the youth folded in the lower-right to physically manifest the extreme power imbalance",
              "Use harsh, high-contrast sunlight to highlight the stark white hair and the hand on the youth's head against the bloody, dim slaughterhouse background"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e83ea5e889292c83",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "be9248a543aab499",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 44,
        "dependency_reason": "동일 씬 내 동일 장소(도축장)의 조명 및 환경 연속성 유지",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 44,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At shoulder height beside the nearest bowed youth, the tracking move settles into a medium three-quarter composition with 강영란(흰 머리 여자) bending into the upper-left and the youth folded beneath her hand in the lower-right. Her relaxed palm on his head becomes the compositional hinge, while other prostrate youths remain secondary and lower in the room.",
            "lighting_mood": "Midday sunlight from the broken window creates hard separation across 강영란(흰 머리 여자)'s pale hair, her resting hand, and the bowed youth amid the darker interior.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "slaughterhouse_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the slaughterhouse features a broken window situated high on one side, serving as the primary source of stark midday sunlight. The floor and walls are scattered with visible bloodstains, while metallic hanging hooks and equipment remain in the surrounding space, reflecting harsh highlights from the sun.",
                "applies_to_shots": [
                  1,
                  6,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "깨진 창으로 스며드는 한낮 햇살에 바닥과 벽, 곳곳에 핏자국들",
                  "Midday sunlight entering through the broken window cuts across the bloodstained interior",
                  "Established midday sunlight from the broken window"
                ],
                "visual_inferences": [
                  "The broken window consistently dictates the lighting direction and high contrast across the entire scene."
                ],
                "creative_decisions": [
                  "Use the harsh sunlight and prominent bloodstains to emphasize the gruesome and chilling nature of the location."
                ],
                "confidence": "high"
              },
              {
                "element_id": "yeong_ran_pale_hair",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "The woman is distinguished by her stark pale, white hair. This prominent physical trait consistently catches the bright midday sunlight entering the room, standing out vividly against the otherwise dim and deeply shadowed interior.",
                "applies_to_shots": [
                  6,
                  12
                ],
                "element_scope": "close",
                "source_facts": [
                  "강영란(흰 머리 여자)",
                  "sunlight from the broken window creates hard separation across the woman's pale hair",
                  "sunlight from the broken window catches her pale hair"
                ],
                "visual_inferences": [
                  "Her white hair acts as a natural reflector for the harsh sunlight, drawing immediate visual attention to her head and face."
                ],
                "creative_decisions": [
                  "Maintain the stark whiteness of her hair to create a heavy color contrast with the deep-red blood and the dark, gritty environment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 44,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "730030c1a9cc259d"
      },
      {
        "scene_index": 44,
        "heading": "45. 실내. 도축장 - 낮",
        "beat_title": "피를 핥는 영란과 공포에 질린 청년들",
        "representative_moment": "An Asian woman in a tight close-up, licking blood off her sharp fingernail.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight eye-level close-up, high contrast midday sunlight against low-key shadow",
            "t2i_prompt": "Photorealistic cinematic still. An Asian woman in dark clothing, facing the camera in a tight eye-level close-up, her face occupying the center. She is looking down, her stark pale, white hair illuminated by harsh midday sunlight. A sharp, raised fingernail tipped with deep-red blood enters beside her mouth, her tongue touching the wet, blood-marked tip. The bright sunlight catches her hair, tongue, and the nail, creating a stark contrast against the low-key, deep-shadowed interior. The slaughterhouse environment recedes into a narrow, unfocused border, with small, soft out-of-focus vertical forms of metallic hanging hooks visible in the dim background.",
            "outfit_assignments": [],
            "source_facts": [
              "강영란(흰 머리 여자): 자기 손톱에 묻은 피를 혀로 스윽- 핥아먹는 영란.",
              "Shot 12: 강영란(흰 머리 여자)이 붉은 피가 묻은 날카로운 손톱 끝에 혀를 댄 채 기괴한 표정을 짓고 있는 얼굴 클로즈업.",
              "sunlight from the broken window catches her pale hair",
              "tongue touching raised claw, gaze=down, state=alive"
            ],
            "visual_inferences": [
              "Her white hair acts as a natural reflector for the harsh sunlight, drawing immediate visual attention to her head and face.",
              "The broken window consistently dictates the lighting direction and high contrast across the entire scene.",
              "The background slaughterhouse environment is rendered completely out of focus due to the tight close-up framing."
            ],
            "creative_decisions": [
              "Use a tight close-up to emphasize the gruesome action, with the background metallic hooks reduced to soft, out-of-focus vertical forms.",
              "Apply high contrast lighting to isolate her pale hair, tongue, and the deep-red blood against the dark, low-key interior shadow."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "15c0141f3974d488",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "db5b91b1a24263e8",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 12,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 44,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 강영란(흰 머리 여자)'s eye level, the dolly-in finishes directly before her face and raised hand, holding a tight close-up rather than losing the gesture to abstraction. Her face occupies the center and her blood-marked fingernail enters beside her mouth as her tongue meets its tip; the slaughterhouse recedes into a narrow, unfocused border.",
            "lighting_mood": "Established midday sunlight from the broken window catches her pale hair, tongue, and blood-tipped nail against low-key interior shadow and a restrained deep-red accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "slaughterhouse_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the slaughterhouse features a broken window situated high on one side, serving as the primary source of stark midday sunlight. The floor and walls are scattered with visible bloodstains, while metallic hanging hooks and equipment remain in the surrounding space, reflecting harsh highlights from the sun.",
                "applies_to_shots": [
                  1,
                  6,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "깨진 창으로 스며드는 한낮 햇살에 바닥과 벽, 곳곳에 핏자국들",
                  "Midday sunlight entering through the broken window cuts across the bloodstained interior",
                  "Established midday sunlight from the broken window"
                ],
                "visual_inferences": [
                  "The broken window consistently dictates the lighting direction and high contrast across the entire scene."
                ],
                "creative_decisions": [
                  "Use the harsh sunlight and prominent bloodstains to emphasize the gruesome and chilling nature of the location."
                ],
                "confidence": "high"
              },
              {
                "element_id": "yeong_ran_pale_hair",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "The woman is distinguished by her stark pale, white hair. This prominent physical trait consistently catches the bright midday sunlight entering the room, standing out vividly against the otherwise dim and deeply shadowed interior.",
                "applies_to_shots": [
                  6,
                  12
                ],
                "element_scope": "close",
                "source_facts": [
                  "강영란(흰 머리 여자)",
                  "sunlight from the broken window creates hard separation across the woman's pale hair",
                  "sunlight from the broken window catches her pale hair"
                ],
                "visual_inferences": [
                  "Her white hair acts as a natural reflector for the harsh sunlight, drawing immediate visual attention to her head and face."
                ],
                "creative_decisions": [
                  "Maintain the stark whiteness of her hair to create a heavy color contrast with the deep-red blood and the dark, gritty environment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 44,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "6627a70349f1423d"
      },
      {
        "scene_index": 45,
        "heading": "실외. 숲길 - 낮",
        "beat_title": "고산들의 멈칫",
        "representative_moment": "강영란(C07)이 숲길을 걷다 우뚝 멈춰 서서 뒤에 선 산들을 뚫어지게 돌아본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest height lateral medium profile, restrained daytime contrast",
            "t2i_prompt": "Photorealistic cinematic still. Captured from chest height on the lateral side, the torso and head of C07O10 in a white shaman dress, an East Asian elderly woman with a beautiful elderly face, distinctly visible white hair tied back, and long sharp nails, dominate the left foreground in right profile, her weight locked in a halted posture. She shares a rigid horizontal gaze axis with the torso and head of an Asian man in dark clothes standing in the right background at a three-quarter angle from the left, halted with breath held, their lower bodies implied beyond the frame edge. They are anchored together by the forest path between them in the lower-center midground. The shared natural dirt path runs through the daytime forest, surrounded by trees and earthy terrain, with tree sides receding behind the left and right figures. Daytime forest ambience is shaped into restrained contrast, holding both faces legible while allowing the space between their fixed gazes to remain tense.",
            "outfit_assignments": [
              {
                "character_id": "C07",
                "outlook_id": "O10"
              }
            ],
            "source_facts": [
              "S46 action: 영란 suddenly stops and turns around to look at 산들 on the daytime forest path.",
              "shot description: medium profile from chest height on 강영란's lateral side.",
              "environment: daytime forest path, earthy terrain."
            ],
            "visual_inferences": [
              "fixed_element youngran_white_hair integrated into C07O10 descriptor to avoid double description.",
              "Unregistered character 고산들 described using a generic demographic descriptor (an Asian man) as per id_policy."
            ],
            "creative_decisions": [
              "Chest-height framing applied to show torso and head while geometrically implying lower bodies beyond the lower frame edge.",
              "Tree sides arranged to recede behind both figures, preventing visual interruption of their tense horizontal gaze axis."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "drainage ditch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "forest path",
                "usage_kind": "anchor",
                "source_phrase": "the forest path between them in the lower-center midground"
              },
              {
                "owned_token": "industrial building",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "anchor",
                "source_phrase": "surrounded by trees and earthy terrain, with tree sides receding"
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "4dc430d06301320a",
              "owned_hash": "96344bdd3c8384af",
              "camera_direction_hash": "b6874b6dde2f3311",
              "owned_usage_hash": "3f37ff4c0b51566f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "forest path",
                  "violating_phrase": "the forest path between them in the lower-center midground",
                  "reason": "The prompt uses the forest path purely as a spatial anchor to orient the two characters in the frame, which is a valid anchor reference in line with the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "tree",
                  "violating_phrase": "surrounded by trees and earthy terrain, with tree sides receding",
                  "reason": "The prompt refers to trees as part of the background environment to establish depth and composition, which serves as a valid anchor reference in line with the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 3,
        "visible_entities": [
          "C07"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 45,
            "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 on 강영란(흰 머리 여자)'s lateral side, the track settles into a tightened medium profile with her held at the left foreground and 고산들 retained farther along her sightline at the right. Her abrupt halt and turned head form a rigid horizontal gaze axis across the forest path, compressing the emotional distance without yet moving into the later face-to-face close framing.",
            "lighting_mood": "Daytime forest ambience is shaped into restrained contrast, holding both profiles legible while allowing the space between their gazes to remain tense.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "forest path between them",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C07",
                "outlook_id": "O10"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L27B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "drainage ditch",
              "fence",
              "fern",
              "forest path",
              "industrial building",
              "rock",
              "shrub",
              "tree",
              "utility pole"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_forest_path",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A natural dirt path running through a forest during the daytime, surrounded by trees and earthy terrain.",
                "applies_to_shots": [
                  3,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲길 - 낮",
                  "흙바닥에 머리를 댄 채",
                  "receding forest path",
                  "earthy neutral surroundings"
                ],
                "visual_inferences": [
                  "The ground is unpaved, consisting of natural dirt and earth appropriate for a forest trail."
                ],
                "creative_decisions": [
                  "Earthy neutral tones dominate the surrounding environment to subtly contrast with the high emotional tension of the characters."
                ],
                "confidence": "high"
              },
              {
                "element_id": "youngran_white_hair",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "An older woman with distinctly visible white hair.",
                "applies_to_shots": [
                  3,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "강영란(흰 머리 여자)"
                ],
                "visual_inferences": [
                  "Her white hair is her most prominent identifying feature, remaining clearly visible regardless of whether she is standing or kneeling."
                ],
                "creative_decisions": [
                  "The white hair catches the ambient forest daylight, subtly highlighting her commanding presence in the scene."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C07O10",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L27B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "5c7e7b85e2ac4947"
      },
      {
        "scene_index": 45,
        "heading": "실외. 숲길 - 낮",
        "beat_title": "자책하며 엎드린 산들",
        "representative_moment": "고산들(C08)이 흙바닥에 뺨을 댄 채 절망적으로 눈물을 흘리고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low ground-level observer, tight three-quarter profile close-up, shaped daylight with blue-black shadows",
            "t2i_prompt": "Photorealistic cinematic still. Shot from a low observer near ground level, the lens points downward almost parallel to the earth. C08O11 in a dark jacket, an Asian middle-aged man with short black hair and sharp eyes, lies prostrate across the middle and lower frame in left three-quarter profile. His compressed cheek is pressed directly against [: the natural dirt path occupying the lower frame edge]. His tearful eyes look down at the earth, his face remaining sharply in focus. Shaped daytime light creates a restrained contrast across his features, casting blue-black shadows. Behind him, [: the earthy terrain of the forest path recedes diagonally into the peripheral background], kept heavily out of focus to isolate his despairing expression.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "S45 action: 흙바닥에 머리를 댄 채 절망적인 표정으로 눈물을 머금고 엎드려 있는 고산들의 모습",
              "shot description: From near ground level at 고산들's side, holding him in a tight three-quarter profile"
            ],
            "visual_inferences": [
              "fixed_element daytime_forest_path: natural dirt path beneath his face",
              "close framing heavily blurs the receding path to keep the focus on his tearful eyes and compressed cheek"
            ],
            "creative_decisions": [
              "restrained contrast with blue-black shadows to heighten the emotional tension and despair",
              "earthy neutral tones for the out-of-focus background to match the physical environment"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "drainage ditch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "forest path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "industrial building",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "3859d094bf8be580",
              "owned_hash": "96344bdd3c8384af",
              "camera_direction_hash": "abf161bacbae1487",
              "owned_usage_hash": "83f5ad70e203ca38",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 45,
        "dependency_reason": "같은 숲길 공간이 배경이며, close framing이므로 흙바닥의 질감과 조명 톤을 연속적으로 계승",
        "_shot_index": 8,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 45,
            "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 near ground level at 고산들's side, the lens completes its downward tilt until it runs almost parallel to his lowered face and the earth, holding him in a tight three-quarter profile across the middle and lower frame. His tearful eyes and compressed cheek remain sharp while the receding forest path is reduced to peripheral context, with no other figure entering the frame.",
            "lighting_mood": "Shaped daylight creates restrained contrast across his tearful face with blue-black shadows and earthy neutral surroundings.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L27B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_forest_path",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A natural dirt path running through a forest during the daytime, surrounded by trees and earthy terrain.",
                "applies_to_shots": [
                  3,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲길 - 낮",
                  "흙바닥에 머리를 댄 채",
                  "receding forest path",
                  "earthy neutral surroundings"
                ],
                "visual_inferences": [
                  "The ground is unpaved, consisting of natural dirt and earth appropriate for a forest trail."
                ],
                "creative_decisions": [
                  "Earthy neutral tones dominate the surrounding environment to subtly contrast with the high emotional tension of the characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 45,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "916da6f19aa95b29"
      },
      {
        "scene_index": 45,
        "heading": "실외. 숲길 - 낮",
        "beat_title": "고산들의 회한과 강영란의 비장한 결의",
        "representative_moment": "무릎을 꿇은 C08을 꽉 끌어안은 채 허공을 노려보는 C07의 굳은 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close oblique view at eye height with hard emotional contrast lighting",
            "t2i_prompt": "Photorealistic cinematic still. Close framing at the eye height of a kneeling pair, the shared earthy terrain of a natural dirt path falling softly into subdued earthy tones in the background. In the center, C07O10 in white ritual robes, an older Asian woman with tied-up and distinctly visible white hair, kneels at three-quarter angle from the right. She exhibits variant features carried from stable_traits, with an elegant aged face set in a rigid expression and long sharp nails visible as her arms lock in a firm embrace around C08O11. She is gazing into the distance past him, her face highlighted by controlled daylight in hard emotional contrast. In the lower foreground edge, C08O11 in dark casual clothes, a middle-aged Asian man with short black hair, is folded into her embrace in an over-the-shoulder view. He is looking down with his head bowed and one shoulder visible, preserving the grip of the physical bond without obscuring her intense expression.",
            "outfit_assignments": [
              {
                "character_id": "C07",
                "outlook_id": "O10"
              },
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "영란도 꿇어앉아 산들을 어루만진다.",
              "그렇게 부등켜 안은 영란과 산들은 오히려 그 누구보다 모자(母子) 같은 모습이다.",
              "고산들을 꼭 끌어안은 강영란(흰 머리 여자)이 비장한 눈빛으로 허공을 노려보는 굳은 얼굴 클로즈업.",
              "실외. 숲길 - 낮"
            ],
            "visual_inferences": [
              "fixed_element youngran_white_hair: An older woman with distinctly visible white hair.",
              "fixed_element daytime_forest_path: A natural dirt path running through a forest... earthy terrain.",
              "C08's face is mostly hidden from the camera's view due to the over-the-shoulder, bowed head posture, emphasizing C07's dominant emotional presence."
            ],
            "creative_decisions": [
              "Applied a close oblique view placed just off center to highlight the psychological tension in C07's face.",
              "Used controlled daylight for hard emotional contrast on C07's face while allowing the background to recede into subdued earthy tones.",
              "Positioned C08's bowed head and one shoulder along the lower foreground edge to comply with the close framing requirement of isolating the primary subject (C07)."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "drainage ditch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "forest path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "industrial building",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "4c451c53aa7c8c95",
              "owned_hash": "96344bdd3c8384af",
              "camera_direction_hash": "1ead010eef3f246b",
              "owned_usage_hash": "83f5ad70e203ca38",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 45,
        "dependency_reason": "Same continuous space (daytime forest path), carrying over the exact background atmosphere and lighting.",
        "_shot_index": 10,
        "visible_entities": [
          "C07",
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 45,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At the seated pair's eye height on the outward-facing side of the embrace, the dolly-in resolves into a close oblique view of 강영란(흰 머리 여자)'s rigid face, placed just off center as she stares past 고산들. His bowed head and one shoulder remain along the lower foreground edge, preserving the grip of the embrace without obscuring her expression.",
            "lighting_mood": "Controlled daylight holds 강영란(흰 머리 여자)'s face in hard emotional contrast while the embrace recedes into subdued earthy tones.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C07",
                "outlook_id": "O10"
              },
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L27B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_forest_path",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A natural dirt path running through a forest during the daytime, surrounded by trees and earthy terrain.",
                "applies_to_shots": [
                  3,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲길 - 낮",
                  "흙바닥에 머리를 댄 채",
                  "receding forest path",
                  "earthy neutral surroundings"
                ],
                "visual_inferences": [
                  "The ground is unpaved, consisting of natural dirt and earth appropriate for a forest trail."
                ],
                "creative_decisions": [
                  "Earthy neutral tones dominate the surrounding environment to subtly contrast with the high emotional tension of the characters."
                ],
                "confidence": "high"
              },
              {
                "element_id": "youngran_white_hair",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "An older woman with distinctly visible white hair.",
                "applies_to_shots": [
                  3,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "강영란(흰 머리 여자)"
                ],
                "visual_inferences": [
                  "Her white hair is her most prominent identifying feature, remaining clearly visible regardless of whether she is standing or kneeling."
                ],
                "creative_decisions": [
                  "The white hair catches the ambient forest daylight, subtly highlighting her commanding presence in the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 45,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C07O10",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "e8cf409b5fbc9dfa"
      },
      {
        "scene_index": 46,
        "heading": "47. 실외. 숲속 - 낮",
        "beat_title": "이름이 새겨진 비석 앞의 공포",
        "representative_moment": "자신의 이름이 새겨진 비석 가장자리 옆에서 극심한 공포에 질려 굳어 있는 젊은 여성의 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme facial close-up with stark daylight contrast",
            "t2i_prompt": "Photorealistic cinematic still. The narrow edge of a stone grave marker with a carved name is visible in the middle-left midground, while a young Korean woman occupies most of the right side in an extreme facial close-up. She is frozen with her chin withdrawn at a three-quarter angle from the left, her widened, frightened eyes fixed off-screen and her breath arrested in terror. Daylight shapes stark facial contrast across her features, restraining the soft out-of-focus forest periphery to subdued blue-black and earthy neutral tones.",
            "outfit_assignments": [],
            "source_facts": [
              "비석 위 자기 이름을 바라보는 수리영 얼굴에 공포가 덧씌워진다.",
              "떨리는 눈… 차오르는 숨을 애써 고른다.",
              "shot description: 자신의 이름이 새겨진 비석 앞에서 극심한 공포에 질려 눈을 크게 뜬 채 굳어 있는 김지후 얼굴 클로즈업."
            ],
            "visual_inferences": [
              "fixed_element ji_hoo_terrified_expression: widened, frightened eyes frozen in terror",
              "fixed_element forest_environment_tones: subdued blue-black and earthy neutral tones with stark daylight contrast",
              "grave marker edge provides spatial context without dominating the frame due to close framing"
            ],
            "creative_decisions": [
              "Extreme facial close-up occupying the right side to maximize psychological tension.",
              "Placing the grave marker edge in the middle-left midground to visually bind her terror to the carved name as specified by the spatial contract.",
              "Using stark facial contrast against a dark, desaturated out-of-focus background to isolate the character's fear."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ba52fd1132b41330",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "50a47c2ef388bd51",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 24,
        "dependency_reason": "같은 공간(숲) 배경 연속성 유지이나 클로즈업 샷이므로 배경 디테일은 소프트 포커스로 생략",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 46,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The advancing camera finishes beside the grave marker in an extreme facial close-up of 김지후(강수리영), with her widened eyes and arrested breath occupying most of the right side. A narrow edge of the marker remains at the left border with the carved name legible enough to bind her terror to the place.",
            "lighting_mood": "Daylight is shaped into stark facial contrast, restraining the forest to blue-black and earthy neutral tones around her frightened eyes.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "수리영 이름이 새겨진 비석 가장자리",
                  "screen_zone": "middle_left",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "forest_environment_tones",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The forest setting features subdued blue-black and earthy neutral tones with a desaturated color palette. High-contrast daylight filters through the surroundings, casting stark shadows and giving a heavy, tense atmosphere to the woods.",
                "applies_to_shots": [
                  3,
                  11,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "restraining the forest to blue-black and earthy neutral tones",
                  "subdued blue-black and earthy forest tones",
                  "earthy, desaturated palette",
                  "High-contrast daylight"
                ],
                "visual_inferences": [
                  "The dense trees and foliage appear dark, absorbing the light and emphasizing the stark daylight contrast and isolation of the area."
                ],
                "creative_decisions": [
                  "Using a heavy, desaturated color palette to continuously reflect the psychological tension, fear, and imposing nature of the environment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ji_hoo_terrified_expression",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Kim Ji-hoo's face clearly displays widened, frightened eyes that convey her state of extreme shock and panic. Her expression remains frozen in terror, serving as the focal point of her fear regardless of her body's posture.",
                "applies_to_shots": [
                  3,
                  11
                ],
                "element_scope": "close",
                "source_facts": [
                  "widened eyes and arrested breath",
                  "frightened eyes",
                  "widened eyes and braced upper body",
                  "공포가 덧씌워진다",
                  "떨리는 눈"
                ],
                "visual_inferences": [
                  "Her face may show faint traces of sweat or dirt, reflecting her desperate and exhausted wandering through the woods before the attack."
                ],
                "creative_decisions": [
                  "Maintaining her widened eyes as the primary emotional anchor across different shots to sustain the psychological tension of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 24,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "63ed7fa4612103cd"
      },
      {
        "scene_index": 46,
        "heading": "실외. 숲속 - 낮",
        "beat_title": "수리영을 구해내는 듬직한 산들",
        "representative_moment": "바닥에 쓰러진 수리영이 공포에 질려 올려다보는 가운데, 거대 염소를 때려눕히고 우뚝 선 고산들의 듬직한 실루엣.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low static position looking upward, high-contrast daylight with heavy shadows",
            "t2i_prompt": "Photorealistic cinematic still. C08O11 in dark outdoor clothing, an Asian middle-aged man with short black hair, square jaw, and sharp eyes, stands in the middle-right midground, looking toward a fallen Korean woman in her 20s sprawled in the lower-left foreground across the earthy forest ground they both occupy. Captured from a low observer at ground level, the woman's braced elbows and upper body occupy the lower-left frame while the lens looks upward along her eyeline toward C08O11, whose physically large, broad-shouldered figure extends toward the upper edge. C08O11 is seen at three-quarter angle from the left, his feet planted firmly after a strike, his firm weight and body volume casting a heavy silhouette against the stark daylight. The woman, seen at three-quarter angle from the right, has widened, frightened eyes frozen in terror, her gaze fixed on him. Subdued blue-black and earthy neutral tones dominate the surrounding woods with a desaturated color palette, as high-contrast daylight filters through the vertical trees, casting stark shadows and emphasizing the imposing human barrier.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "S46 action: Ji-hoo (the woman) is sprawled on the ground after falling while running away.",
              "DP instruction: Low static position beside the fallen woman, looking upward along her eyeline toward San-deul in the middle-right."
            ],
            "visual_inferences": [
              "fixed_element forest_environment_tones: subdued blue-black and earthy neutral tones with a desaturated color palette and stark shadows.",
              "fixed_element ji_hoo_terrified_expression: the woman shows widened, frightened eyes frozen in terror.",
              "fixed_element san_deul_imposing_build: C08 projects a physically large and broad-shouldered build, casting a heavy silhouette in stark daylight."
            ],
            "creative_decisions": [
              "Applying the camera_frame_rule by positioning the sprawling woman in the lower-left foreground and extending C08's imposing figure toward the upper edge to match the low-angle upward perspective.",
              "Explicitly naming the shared 'earthy forest ground they both occupy' to satisfy the fg_bg_shared_anchor_rule and anchor both characters in the same space."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "30a72d60ef9e22cf",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "69d13636c7fd7cd3",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 11,
        "visible_entities": [
          "C08",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 46,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the low static position beside the fallen 김지후(강수리영), her widened eyes and braced upper body occupy the lower-left foreground while the lens looks upward along her eyeline. 고산들 is held full-length in the middle-right at the end of that axis, his planted figure providing an immediate human barrier where the attack had been coming from.",
            "lighting_mood": "High-contrast daylight gives 고산들 a firm silhouette-like weight against subdued blue-black and earthy forest tones.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "쓰러진 김지후(강수리영)",
                  "label": "고산들",
                  "screen_zone": "middle_right",
                  "target_id": "C08",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08",
              "L20"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "forest_environment_tones",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The forest setting features subdued blue-black and earthy neutral tones with a desaturated color palette. High-contrast daylight filters through the surroundings, casting stark shadows and giving a heavy, tense atmosphere to the woods.",
                "applies_to_shots": [
                  3,
                  11,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "restraining the forest to blue-black and earthy neutral tones",
                  "subdued blue-black and earthy forest tones",
                  "earthy, desaturated palette",
                  "High-contrast daylight"
                ],
                "visual_inferences": [
                  "The dense trees and foliage appear dark, absorbing the light and emphasizing the stark daylight contrast and isolation of the area."
                ],
                "creative_decisions": [
                  "Using a heavy, desaturated color palette to continuously reflect the psychological tension, fear, and imposing nature of the environment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ji_hoo_terrified_expression",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Kim Ji-hoo's face clearly displays widened, frightened eyes that convey her state of extreme shock and panic. Her expression remains frozen in terror, serving as the focal point of her fear regardless of her body's posture.",
                "applies_to_shots": [
                  3,
                  11
                ],
                "element_scope": "close",
                "source_facts": [
                  "widened eyes and arrested breath",
                  "frightened eyes",
                  "widened eyes and braced upper body",
                  "공포가 덧씌워진다",
                  "떨리는 눈"
                ],
                "visual_inferences": [
                  "Her face may show faint traces of sweat or dirt, reflecting her desperate and exhausted wandering through the woods before the attack."
                ],
                "creative_decisions": [
                  "Maintaining her widened eyes as the primary emotional anchor across different shots to sustain the psychological tension of the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "san_deul_imposing_build",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "Go San-deul presents a physically large and broad-shouldered build, projecting an imposing and solid presence. His figure casts a firm, heavy silhouette in the stark daylight, emphasizing his rugged strength.",
                "applies_to_shots": [
                  11,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "firm silhouette-like weight",
                  "planted figure providing an immediate human barrier",
                  "broad back",
                  "큰 덩치의 검은 염소를 손쉽게 훌쩍 둘러멘다"
                ],
                "visual_inferences": [
                  "He is assumed to wear dark, sturdy outdoor clothing that complements his massive silhouette and suits the rugged forest environment."
                ],
                "creative_decisions": [
                  "Framing his massive physical size to create a stark visual contrast with the vulnerability of the rescued character and the defeated beast."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 46,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "302289fc57e55488"
      },
      {
        "scene_index": 46,
        "heading": "실외. 숲속 - 낮",
        "beat_title": "거대한 위협과 산들의 압도적 완력",
        "representative_moment": "San-deul, carrying a massive black goat on his broad shoulders, begins to walk down the dense forest path.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium shot from upper-back height, observer POV tracking from behind, earthy desaturated palette",
            "t2i_prompt": "Photorealistic cinematic still. C08O11, an Asian middle-aged man in dark outdoor clothing, stands in the middle-center midground with his back to the camera, gazing into the distance while moving toward the descending forest route in the upper-center background. His physically large and broad-shouldered build projects an imposing solid presence, casting a firm heavy silhouette. A massive black goat, severely injured and looking off-screen, is draped across his shoulder, occupying the upper third of the frame. The camera observes from an upper-back height, settling behind his direction of travel as his weight shifts forward into stride. High-contrast daylight filters through the dense forest, casting stark shadows and creating weighty contrast across his back and the black body of the goat. The surroundings feature subdued blue-black and earthy neutral tones with a desaturated color palette, evoking a heavy, tense atmosphere.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "고산들 completes the lift, carrying the giant black goat across his shoulder.",
              "His weight begins to shift forward along the descending route.",
              "restraining the forest to blue-black and earthy neutral tones with an earthy, desaturated palette.",
              "수리영을 공격한 대형 검은 염소가 널부러진 채 밭은 숨만 간신히 내쉬고 있다."
            ],
            "visual_inferences": [
              "fixed_element san_deul_imposing_build: physically large and broad-shouldered build, casting a firm, heavy silhouette in the stark daylight.",
              "fixed_element forest_environment_tones: subdued blue-black and earthy neutral tones, high-contrast daylight casting stark shadows.",
              "The heavy burden of the massive goat emphasizes San-deul's rugged strength as he walks down the path."
            ],
            "creative_decisions": [
              "Framing his broad back in the center from an upper-back height to emphasize his imposing physical presence and the descending path ahead.",
              "Applying a heavy, desaturated color palette to continuously reflect the psychological tension of the isolated environment.",
              "Using weighty contrast across his back and the black goat to highlight the tactile cinematic texture."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ee64560b832aaf61",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "44e490cb1d46bcc1",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 44,
        "dependency_reason": "location",
        "_shot_index": 16,
        "visible_entities": [
          "C08",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 46,
            "shot_index": 16
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The following camera briefly closes in from upper-back height as 고산들 completes the lift, framing his broad back in the center while the 수리영을 공격한 대형 검은 염소 lies across his shoulder through the upper third without occupying more than two-fifths of the image. His weight begins to shift forward along the descending route, and the camera settles behind that direction of travel.",
            "lighting_mood": "Daylight is controlled into weighty contrast across 고산들's back and the black body of the goat, with an earthy, desaturated palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "descending forest route",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "descending forest route",
                  "label": "고산들",
                  "screen_zone": "middle_center",
                  "target_id": "C08",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08",
              "L20"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "forest_environment_tones",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The forest setting features subdued blue-black and earthy neutral tones with a desaturated color palette. High-contrast daylight filters through the surroundings, casting stark shadows and giving a heavy, tense atmosphere to the woods.",
                "applies_to_shots": [
                  3,
                  11,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "restraining the forest to blue-black and earthy neutral tones",
                  "subdued blue-black and earthy forest tones",
                  "earthy, desaturated palette",
                  "High-contrast daylight"
                ],
                "visual_inferences": [
                  "The dense trees and foliage appear dark, absorbing the light and emphasizing the stark daylight contrast and isolation of the area."
                ],
                "creative_decisions": [
                  "Using a heavy, desaturated color palette to continuously reflect the psychological tension, fear, and imposing nature of the environment."
                ],
                "confidence": "high"
              },
              {
                "element_id": "san_deul_imposing_build",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "Go San-deul presents a physically large and broad-shouldered build, projecting an imposing and solid presence. His figure casts a firm, heavy silhouette in the stark daylight, emphasizing his rugged strength.",
                "applies_to_shots": [
                  11,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "firm silhouette-like weight",
                  "planted figure providing an immediate human barrier",
                  "broad back",
                  "큰 덩치의 검은 염소를 손쉽게 훌쩍 둘러멘다"
                ],
                "visual_inferences": [
                  "He is assumed to wear dark, sturdy outdoor clothing that complements his massive silhouette and suits the rugged forest environment."
                ],
                "creative_decisions": [
                  "Framing his massive physical size to create a stark visual contrast with the vulnerability of the rescued character and the defeated beast."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 44,
                "shot_index": 12,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "dfa5980e21b3da9d"
      },
      {
        "scene_index": 47,
        "heading": "실외. 해안마을 선착장 - 낮",
        "beat_title": "좌절된 배편 구하기",
        "representative_moment": "모닥불 가에 쪼그리고 앉은 남자가 애타게 배편을 묻지만, 어부는 심드렁하게 소주잔을 들고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "crouching eye height, static wide composition, muted natural daylight with local warmth",
            "t2i_prompt": "Photorealistic cinematic still. At crouching eye height beside the group, a static wide composition captures an outdoor coastal pier bathed in plain, unsoftened natural daylight. A burning barrel fire sits between two figures as a shared spatial anchor, its side and upper opening visible obliquely. In the left foreground, an Asian young man in a worn jacket is squatting with hands clasped at three-quarter angle from the right, looking off-screen with a deeply worried expression. Across the flames in the right midground, an Asian middle-aged man in fisher workwear is seated at three-quarter angle from the left, holding a small glass, his eyes fixed on the young man with an indifferent posture. The natural daylight is offset locally by the barrel fire's muted warmth, maintaining a low-key, earthy realism. The busy pier extends behind the group, receding toward the far end in an earthy, muted tone devoid of sensational brightness. The camera focuses on the spatial tension and diagonal line between the young man's lifted face and the seated fisherman.",
            "outfit_assignments": [],
            "source_facts": [
              "실외. 해안마을 선착장 - 낮",
              "어부 서너 명이 드럼통 모닥불 가에서 소주잔을 기울이고 있는데, 옆에 쪼그리고 앉은 인우는 방금 전 수리영 같은 표정이다.",
              "대답 대신 어깨만 으쓱 하는 어부들."
            ],
            "visual_inferences": [
              "fixed_element daylight_pier_setting",
              "barrel fire acting as a shared spatial anchor between foreground and midground figures",
              "indifferent posture of the fisherman contrasting with the young man's desperation"
            ],
            "creative_decisions": [
              "wide framing from a low angle to show the spatial relationship across the barrel fire",
              "earthy and muted color palette to reflect the gritty tone of the isolated coastal village"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "69ea353d7fcff50a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "f7b4763f4d171389",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 44,
        "dependency_reason": "Same location (coastal pier) requires background consistency with the established setting.",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 47,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At crouching eye height beside the group, a static wide composition places 정인우 low in the left foreground, folded beside the barrel fire, while 낚싯꾼 #1 sits across from him in the right midground. The diagonal between 정인우's lifted face and the fisherman's indifferent posture keeps the busy pier secondary but legible behind them.",
            "lighting_mood": "Natural daylight is offset locally by the barrel fire's muted warmth, maintaining a low-key, earthy realism around 정인우's worried face.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daylight_pier_setting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor coastal pier is bathed in plain, unsoftened natural daylight. The overall atmosphere remains earthy, muted, and devoid of sensational brightness, establishing a realistic and gritty tone for the environment.",
                "applies_to_shots": [
                  1,
                  7,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 해안마을 선착장 - 낮",
                  "대낮의 해안가 선착장",
                  "Natural daylight",
                  "Unsoftened daylight",
                  "Plain daylight"
                ],
                "visual_inferences": [
                  "The daytime light creates clear visibility but maintains a somber mood with harsh, realistic shadows typical of a coastal village."
                ],
                "creative_decisions": [
                  "Keeping the color palette restrained and deep-toned to avoid glorifying the tragic events."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 44,
                "shot_index": 12,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "e942a573f9378cc3"
      },
      {
        "scene_index": 47,
        "heading": "48. 실외. 해안마을 선착장 - 낮",
        "beat_title": "참혹한 시신과 사진을 찍는 구경꾼들",
        "representative_moment": "폴리스 라인 안쪽 바닥에 머리와 팔이 뜯겨나간 시신이 널브러져 있고, 그 밖에서 구경꾼들이 핸드폰을 들고 시신을 찍고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "overhead steep high-angle wide shot, unsoftened natural daylight with muted earthy and deep-red tones",
            "t2i_prompt": "Photorealistic cinematic still. Overhead steep high-angle view looking directly down at a concrete coastal pier bathed in unsoftened plain daylight. In the center, a lifeless figure in tattered dark clothes is sprawled face-down with back to camera, the body motionless and gruesomely missing its head and one arm. A contained, irregular pool of deep red blood spreads across the earthy ground beneath the torn shoulder. Across the upper frame edge, a bright police line tape stretches horizontally, acting as a rigid spatial boundary. Just beyond the tape at the top of the frame, a dense crowd of casually dressed Asian civilian onlookers forms a restless human wall, their hands raised to hold up mobile phones angled down toward the remains. The restrained color palette highlights the brutal reality without sensational gloss.",
            "outfit_assignments": [],
            "source_facts": [
              "실외. 해안마을 선착장 - 낮",
              "시체는 머리와 팔 한쪽이 뜯겨져 나가고 없는 참혹한 상태",
              "경찰들이 폴리스라인을 치고 접근을 막고 있지만",
              "저마다 핸드폰을 들고 기념사진 찍는 듯 시체를 찍고",
              "몰려든 구경꾼들은 애도는 커녕 막 들어온 횟감 흥정하듯 아주 떠들썩 하다"
            ],
            "visual_inferences": [
              "fixed_element daylight_pier_setting: plain, unsoftened natural daylight, realistic and gritty tone",
              "fixed_element police_line_tape: tape stretched horizontally, physical barrier at the frame edge",
              "fixed_element onlooking_crowd_background: dense crowd pressed against the police tape, holding mobile phones",
              "The body is sprawled face-down to accommodate the back-to-camera orientation and clearly display the missing limbs from a high angle."
            ],
            "creative_decisions": [
              "Steep overhead high-angle wide framing to clearly show the body's missing parts and the blood pool while keeping the chaotic crowd confined to the upper frame edge as a spatial backdrop.",
              "Restrained earthy, blue-black, and deep-red palette to maintain a somber, tragic clarity and avoid glorifying the violence."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b4e5672193c9c467",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "30d54b7430dcf648",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 44,
        "dependency_reason": "동일한 해안마을 선착장 공간적 배경(S44_Shot12) 공유 및 분위기 연속성 유지",
        "_shot_index": 7,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 47,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From inside the police line, the camera holds a steep high-angle view that contains the 시신's entire sprawled form while clearly revealing the absent head and one missing arm. The surrounding blood remains visible as a contained irregular area around the body, while the police line and distant onlookers stay near the frame edge as spatial evidence rather than competing subjects.",
            "lighting_mood": "Unsoftened daylight presents the body with tragic clarity while the restrained blue-black, earthy, and deep-red palette avoids sensational gloss.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daylight_pier_setting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor coastal pier is bathed in plain, unsoftened natural daylight. The overall atmosphere remains earthy, muted, and devoid of sensational brightness, establishing a realistic and gritty tone for the environment.",
                "applies_to_shots": [
                  1,
                  7,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 해안마을 선착장 - 낮",
                  "대낮의 해안가 선착장",
                  "Natural daylight",
                  "Unsoftened daylight",
                  "Plain daylight"
                ],
                "visual_inferences": [
                  "The daytime light creates clear visibility but maintains a somber mood with harsh, realistic shadows typical of a coastal village."
                ],
                "creative_decisions": [
                  "Keeping the color palette restrained and deep-toned to avoid glorifying the tragic events."
                ],
                "confidence": "high"
              },
              {
                "element_id": "police_line_tape",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A police line tape is stretched horizontally, serving as a physical barrier to keep the civilians away from the gruesome crime scene. It cuts clearly across the space, establishing a rigid boundary between the investigation area and the surrounding chaotic space.",
                "applies_to_shots": [
                  7,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "경찰들이 폴리스라인을 치고 접근을 막고 있지만",
                  "police line and distant onlookers stay near the frame edge",
                  "police line cuts horizontally between their depth planes"
                ],
                "visual_inferences": [
                  "The tape is standard and bright enough to stand out as a strict dividing line against the muted earthy tones of the pier."
                ],
                "creative_decisions": [
                  "Using the tape as a strong compositional divider to separate the orderly authorities from the chaotic civilians."
                ],
                "confidence": "high"
              },
              {
                "element_id": "onlooking_crowd_background",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense crowd of civilian onlookers is pressed against the police tape, forming a restless background. They appear highly agitated and intrusive, with several individuals inappropriately holding up their mobile phones to capture the scene.",
                "applies_to_shots": [
                  7,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "몰려든 구경꾼들은 애도는 커녕 막 들어온 횟감 흥정하듯 아주 떠들썩 하다.",
                  "저마다 핸드폰을 들고 기념사진 찍는 듯 시체를 찍고",
                  "distant onlookers",
                  "members of the crowd",
                  "pressed behind police line"
                ],
                "visual_inferences": [
                  "The crowd creates a tightly packed human wall that physically pushes against the boundary, consisting of casually dressed locals."
                ],
                "creative_decisions": [
                  "Depicting the crowd as an insensitive, buzzing mass to contrast with the solemnity of the gruesome crime."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 44,
                "shot_index": 12,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "cdd1d89c32153c51"
      },
      {
        "scene_index": 47,
        "heading": "실외. 해안마을 선착장 - 낮",
        "beat_title": "형사와 인우의 첫 대면",
        "representative_moment": "참혹한 현장 바닥에서 몸을 일으키던 형사가 폴리스 라인 밖 인파 속의 인우와 눈이 마주친 채 멈칫하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "standing eye-height side-on composition, restrained daylight contrast",
            "t2i_prompt": "Photorealistic cinematic still captured at standing eye height. A bright police line dividing the two men stretches horizontally across the lower-center foreground, serving as a shared spatial anchor between the restricted area and the public space. In the left midground, an Asian middle-aged man in a detective jacket is caught halfway upright with knees bent, positioned in right profile with his eyes fixed on the man opposite him. In the right background, an Asian young man in a dark casual jacket leans forward through the crowd in left profile, his gaze locked onto the detective in a tense, uninterrupted sightline. A restless, dense crowd of casually dressed locals presses against the tape, looking off-screen toward the unseen ground. Several people hold up mobile phones, their screen faces directed toward the investigation area to photograph the scene. The outdoor coastal pier is bathed in plain, unsoftened natural daylight, casting harsh realistic shadows that highlight the earthy, muted tones and restrained contrast of the environment.",
            "outfit_assignments": [],
            "source_facts": [
              "40대 형사가 일어나다 인우와 시선이 마주친다.",
              "경찰들이 폴리스라인을 치고 접근을 막고 있지만",
              "구경꾼들은 저마다 핸드폰을 들고 시체를 찍고",
              "인우가 사람들 사이를 뚫고 고개를 들이민다."
            ],
            "visual_inferences": [
              "fixed_element daylight_pier_setting: plain and unsoftened natural daylight, earthy and muted atmosphere",
              "fixed_element police_line_tape: physical horizontal barrier cutting across the depth planes",
              "fixed_element onlooking_crowd_background: restless crowd forming a human wall against the tape",
              "standing eye height emphasizes the direct horizontal sightline between the two opposing profiles"
            ],
            "creative_decisions": [
              "medium framing scale to clearly capture the spatial tension and fg/bg separation between the two men",
              "restrained contrast allows the locked profiles to stand out against the chaotic, phone-wielding crowd"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e60d6081553afc97",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "38a746de2c17b0d4",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 47,
        "dependency_reason": "동일 씬 내 앞쪽 샷의 선착장 환경 톤(daylight_pier_setting)과 폴리스 라인 공간 설정 일관성 유지",
        "_shot_index": 10,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 47,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At standing eye height beside the investigation area, a slightly tightened side-on composition places 조 형사 at left midground, caught halfway upright, and 정인우 at right background between members of the crowd. The police line cuts horizontally between their depth planes as their opposing profiles lock into a single uninterrupted sightline.",
            "lighting_mood": "Plain daylight is shaped with restrained contrast so the locked profiles read clearly against the restless, muted background.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "police line dividing the two men",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daylight_pier_setting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor coastal pier is bathed in plain, unsoftened natural daylight. The overall atmosphere remains earthy, muted, and devoid of sensational brightness, establishing a realistic and gritty tone for the environment.",
                "applies_to_shots": [
                  1,
                  7,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 해안마을 선착장 - 낮",
                  "대낮의 해안가 선착장",
                  "Natural daylight",
                  "Unsoftened daylight",
                  "Plain daylight"
                ],
                "visual_inferences": [
                  "The daytime light creates clear visibility but maintains a somber mood with harsh, realistic shadows typical of a coastal village."
                ],
                "creative_decisions": [
                  "Keeping the color palette restrained and deep-toned to avoid glorifying the tragic events."
                ],
                "confidence": "high"
              },
              {
                "element_id": "police_line_tape",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A police line tape is stretched horizontally, serving as a physical barrier to keep the civilians away from the gruesome crime scene. It cuts clearly across the space, establishing a rigid boundary between the investigation area and the surrounding chaotic space.",
                "applies_to_shots": [
                  7,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "경찰들이 폴리스라인을 치고 접근을 막고 있지만",
                  "police line and distant onlookers stay near the frame edge",
                  "police line cuts horizontally between their depth planes"
                ],
                "visual_inferences": [
                  "The tape is standard and bright enough to stand out as a strict dividing line against the muted earthy tones of the pier."
                ],
                "creative_decisions": [
                  "Using the tape as a strong compositional divider to separate the orderly authorities from the chaotic civilians."
                ],
                "confidence": "high"
              },
              {
                "element_id": "onlooking_crowd_background",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense crowd of civilian onlookers is pressed against the police tape, forming a restless background. They appear highly agitated and intrusive, with several individuals inappropriately holding up their mobile phones to capture the scene.",
                "applies_to_shots": [
                  7,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "몰려든 구경꾼들은 애도는 커녕 막 들어온 횟감 흥정하듯 아주 떠들썩 하다.",
                  "저마다 핸드폰을 들고 기념사진 찍는 듯 시체를 찍고",
                  "distant onlookers",
                  "members of the crowd",
                  "pressed behind police line"
                ],
                "visual_inferences": [
                  "The crowd creates a tightly packed human wall that physically pushes against the boundary, consisting of casually dressed locals."
                ],
                "creative_decisions": [
                  "Depicting the crowd as an insensitive, buzzing mass to contrast with the solemnity of the gruesome crime."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 47,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "2aa71d7e8d423060"
      },
      {
        "scene_index": 48,
        "heading": "실내. 반월 식당 - 낮",
        "beat_title": "기괴한 도축과 분위기에 압도된 수리영",
        "representative_moment": "식당 구석 테이블에 웅크린 젊은 여성이 주방에서 염소를 해체하는 남자를 불안하게 곁눈질하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Observer POV at seated shoulder height, medium profile compressing the subject in the foreground, low-key ambient lighting",
            "t2i_prompt": "Photorealistic cinematic still. Observer POV at seated shoulder height in a rustic restaurant. A young Korean woman is seated at a simple, worn dining table located in the corner, occupying the left foreground. Shown from the waist up in right profile, her posture is rigid and defensive; her upper body is hunched deep over the table, with her shoulders drawn tightly inward and her hands tucked close to her torso. Her eyes are fixed on a Korean man in the right background. Across the shared earthy neutral space, the man stands in the kitchen at a three-quarter angle from the left, leaning into his butchering work. He is looking down at a headless dead black goat and raw red meat on the counter. The scene's ambient daytime illumination is held in low-key contrast, with restrained deep red tones accentuating the disturbing butchery work in the distance.",
            "outfit_assignments": [],
            "source_facts": [
              "식당 구석 테이블에 잔뜩 웅크리고 앉은 김지후(강수리영)",
              "주방에 산들을 봤다가",
              "산들이 죽은 염소의 핏빛 육고기 손질에 분주하다",
              "머리가 끊어지는 검은 염소"
            ],
            "visual_inferences": [
              "fixed_element suriyoung_seated_posture: posture is rigid and defensive, upper body hunched, shoulders drawn inward",
              "fixed_element restaurant_corner_table: simple dining table located in the corner, worn surface",
              "Observer POV at seated shoulder height places the woman's waist-up figure in the foreground and the kitchen in the right background"
            ],
            "creative_decisions": [
              "Positioning the table to enclose the foreground subject, emphasizing physical boundary and confinement",
              "Using earthy neutrals and low-key contrast to build an unsettling daytime atmosphere",
              "Highlighting the raw meat and kitchen work with a restrained deep red to draw the subject's fearful gaze"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f604df44c3dd3022",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "fd39570806902026",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "Not directly continuing a visual action from an immediately preceding shot in the same space",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 48,
            "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 seated shoulder height beside the corner table, the lateral move settles into a medium profile of 김지후(강수리영), compressed into the left foreground with her shoulders drawn inward. The kitchen lies along her sidelong eyeline in the right background, where 고산들 remains occupied with the dead goat rather than acknowledging her stare.",
            "lighting_mood": "Ambient daytime illumination appropriate to the interior is held in low-key contrast, with earthy neutrals and restrained deep red around the kitchen work.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyoung_seated_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "The young Korean woman remains seated at the corner table in the restaurant. Her posture is consistently rigid and defensive, with her shoulders drawn tightly inward and her upper body hunched over, physically manifesting her constant state of fear.",
                "applies_to_shots": [
                  3,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "식당 구석 테이블에 잔뜩 웅크리고 앉은 김지후(강수리영)",
                  "hunched deep over table, with her shoulders drawn inward",
                  "seated with shoulder locked"
                ],
                "visual_inferences": [
                  "Her hands and arms remain tucked close to her torso to emphasize the defensive, locked-shoulder posture mentioned in the text."
                ],
                "creative_decisions": [
                  "Maintaining her shrinking, static posture consistently across both a medium profile and a tight close-up to anchor her emotional vulnerability."
                ],
                "confidence": "high"
              },
              {
                "element_id": "restaurant_corner_table",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A simple dining table located in the corner of the rustic restaurant. It remains stationary, functioning as a physical boundary and anchor point where the young woman is confined during her tense interactions.",
                "applies_to_shots": [
                  3,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "식당 구석 테이블",
                  "corner table"
                ],
                "visual_inferences": [
                  "The table features a basic, slightly worn surface typical of an old countryside diner, fitting the earthy neutral tones of the environment."
                ],
                "creative_decisions": [
                  "Framing the table as a restrictive barrier that visually enhances the character's feeling of being cornered and trapped."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "cec9ddda229bdbea"
      },
      {
        "scene_index": 48,
        "heading": "49. 실내. 반월 식당 - 낮",
        "beat_title": "섬뜩한 할머니의 위로",
        "representative_moment": "영란이 미소를 지으며 잔뜩 위축된 수리영의 어깨를 감싸 쥐는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight oblique close-up at shoulder height, intimate high-contrast lighting",
            "t2i_prompt": "Photorealistic cinematic still. A tight oblique close-up at shoulder height, focusing sharply on an elderly Asian woman with white hair in the left half, and her hand gripping a shoulder in the lower center. The elderly woman, at a three-quarter angle from the right, leans in, her eyes fixed on the figure beside her with a smiling expression. In the right half, slightly softer in focus, a young Asian woman at a three-quarter angle from the left remains seated at a shared simple dining table, looking down. Her posture is consistently rigid and defensive, with her shoulders drawn tightly inward and her upper body hunched over, receiving the elderly woman's gripping hand on her near shoulder. The near edge of the shared table is visible beneath their arms in the lower frame. Neutral interior daytime ambience creates intimate high-contrast lighting across them. In the soft out-of-focus background obliquely behind the seated pair, an open doorway reveals a hanging garment, its visible red front supplying a restrained deep-red accent.",
            "outfit_assignments": [],
            "source_facts": [
              "영란이 밖으로 나와 수리영 앞에 앉는다.",
              "손녀의 어깨를 쓰다듬으며 미소짓는 영란.",
              "수리영은 그런 할머니 미소가 더 섬뜩한 지 마른침만 꿀꺽 삼킨다.",
              "활짝 문이 열린 할머니 방 안에는 화려한 붉은색 무녀복이 걸려있고"
            ],
            "visual_inferences": [
              "fixed_element suriyoung_seated_posture: rigid and defensive, shoulders drawn tightly inward, upper body hunched over",
              "fixed_element restaurant_corner_table: simple dining table functioning as a physical boundary",
              "elderly woman leans in at a three-quarter angle from the right, gripping the young woman's shoulder",
              "young woman looks down at a three-quarter angle from the left, rendered slightly softer in focus to satisfy the single primary subject rule for close framing"
            ],
            "creative_decisions": [
              "tight oblique close-up focuses sharply on the elderly woman's smiling face and gripping hand, leaving the young woman slightly soft in focus to adhere to the single-camera close-up constraint while emphasizing the unequal power dynamic",
              "intimate high-contrast lighting enhances the sinister and uncanny mood of the affectionate gesture",
              "the hanging red garment in the soft background provides a subtle visual cue of the occult/ritual theme without drawing focus away from the characters"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ba0aff30748389f6",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "984b5dcedc129eb9",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 48,
        "dependency_reason": "식당 구석 테이블의 형태와 수리영의 웅크린 자세 연속성 유지",
        "_shot_index": 10,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 48,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The dolly-in ends at shoulder height in a tight oblique two-person close-up, placing 강영란(흰 머리 여자)'s smiling face in the left half and 김지후(강수리영)'s rigid profile in the right. 강영란(흰 머리 여자)'s hand curves fully around the near shoulder at lower center, making the affectionate gesture read simultaneously as reassurance and restraint.",
            "lighting_mood": "Neutral interior daytime ambience is shaped into intimate high contrast, with the hanging robe supplying a restrained deep-red accent in the background.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "suriyoung_seated_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "The young Korean woman remains seated at the corner table in the restaurant. Her posture is consistently rigid and defensive, with her shoulders drawn tightly inward and her upper body hunched over, physically manifesting her constant state of fear.",
                "applies_to_shots": [
                  3,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "식당 구석 테이블에 잔뜩 웅크리고 앉은 김지후(강수리영)",
                  "hunched deep over table, with her shoulders drawn inward",
                  "seated with shoulder locked"
                ],
                "visual_inferences": [
                  "Her hands and arms remain tucked close to her torso to emphasize the defensive, locked-shoulder posture mentioned in the text."
                ],
                "creative_decisions": [
                  "Maintaining her shrinking, static posture consistently across both a medium profile and a tight close-up to anchor her emotional vulnerability."
                ],
                "confidence": "high"
              },
              {
                "element_id": "restaurant_corner_table",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A simple dining table located in the corner of the rustic restaurant. It remains stationary, functioning as a physical boundary and anchor point where the young woman is confined during her tense interactions.",
                "applies_to_shots": [
                  3,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "식당 구석 테이블",
                  "corner table"
                ],
                "visual_inferences": [
                  "The table features a basic, slightly worn surface typical of an old countryside diner, fitting the earthy neutral tones of the environment."
                ],
                "creative_decisions": [
                  "Framing the table as a restrictive barrier that visually enhances the character's feeling of being cornered and trapped."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 48,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "5de8d5e1a5158da7"
      },
      {
        "scene_index": 49,
        "heading": "실내. 해안마을 횟집 - 밤",
        "beat_title": "확신으로 바뀌는 심증",
        "representative_moment": "정인우가 내민 스마트폰 화면 속 CCTV 캡처본에 강영란(C06)과 황 씨가 찍혀 있는 것을 확인하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static insert shot, extremely shallow depth of field focusing sharply on the smartphone display against a low-key blurred background",
            "t2i_prompt": "Photorealistic cinematic still. A smartphone display showing the CCTV capture occupies the middle-center foreground. Held by a Korean man's hand entering from the bottom edge, the smartphone is positioned above a dining table. The dining table and a blurred Korean man at three-quarter angle from the right looking down are rendered out of focus in the background, enveloped in a low-key nighttime setting with deep blue-black shadows and earthy-neutral tones. On the illuminated front face of the smartphone, visible nearly head-on, the sharp CCTV capture reveals a dark alley receding behind two figures. On one side of the alley, a Korean elderly woman in her late 60s with elegant facial features and neatly tied hair is caught mid-stride at three-quarter angle from the left, looking off-screen. On the other side, a Korean adult man in right profile is pausing beside the alley wall, looking off-screen. Distant fishing boat lights provide subtle background accents in the out-of-focus darkness.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot description: 정인우가 내민 핸드폰 화면에 어둑한 골목길의 강영란과 황봉업이 찍힌 CCTV 캡쳐 사진이 선명하게 떠 있는 찰나",
              "정인우: three_quarter_right, holding phone toward table, gaze=down",
              "강영란: three_quarter_left, caught mid-stride, gaze=off_screen",
              "황봉업(황 씨): profile_right, pausing beside alley wall, gaze=off_screen"
            ],
            "visual_inferences": [
              "fixed_element restaurant_nighttime_ambience: low-key nighttime setting with deep blue-black shadows and earthy-neutral tones, distant fishing boat lights",
              "fixed_element restaurant_table: the dining table grounds the spatial layout but remains out of focus behind the phone",
              "The smartphone acts as a reproduction surface, so the figures inside the screen are described generically without C## IDs, adhering to id_policy rules."
            ],
            "creative_decisions": [
              "Applied an insert framing scale with shallow depth of field to isolate the sharp screen content from the blurred real-world restaurant environment",
              "Incorporated the stable traits of C06 (elegant facial features, neatly tied hair) directly into the generic demographic descriptor for the reproduced face on the screen",
              "Anchored the foreground interaction using the exact frame spatial contract parameters (middle-center foreground)"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bottle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "anchor",
                "source_phrase": "positioned above a dining table"
              },
              {
                "owned_token": "drinking glass",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "service counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "anchor",
                "source_phrase": "A smartphone display showing the CCTV capture occupies the middle-center foreground"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "bed9cc1886ea577d",
              "owned_hash": "97f55b084072415e",
              "camera_direction_hash": "8aa2b4ded7bd6ebb",
              "owned_usage_hash": "78660a5c4de2613d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "dining table",
                  "violating_phrase": "the smartphone is positioned above a dining table. The dining table and a blurred Korean man at three-quarter angle from the right looking down are rendered out of focus in the background",
                  "reason": "The dining table is used strictly as a spatial and out-of-focus background anchor, which is consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "A smartphone display showing the CCTV capture occupies the middle-center foreground... On the illuminated front face of the smartphone, visible nearly head-on, the sharp CCTV capture reveals a dark alley receding behind two figures",
                  "reason": "The prompt specifies the depicted CCTV imagery on the smartphone's display; this visual content modification is explicitly required by the shot_intent to show the CCTV capture, satisfying all requirements for the visual state change exception.",
                  "verdict": "allowed_visual_state_change"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 22,
        "dependency_reason": "동일한 해안마을 횟집 배경 및 공간적 분위기(restaurant_nighttime_ambience, restaurant_table)를 연속적으로 유지하여 샷 간 일관성을 확보함.",
        "_shot_index": 6,
        "visible_entities": [
          "C06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 49,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From just above and slightly behind the phone’s lower edge, the lens looks almost squarely onto the display in a static insert, with the phone centered in the lower-middle of frame and 정인우’s supporting hand entering from below. The CCTV still remains sharp while the table and surrounding figures fall outside the focal plane; 강영란 occupies one side of the displayed alley and 황봉업 the other.",
            "lighting_mood": "The phone display provides the clearest local luminance against a low-key nighttime setting, held within a restrained blue-black and earthy-neutral palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "phone display showing the CCTV capture",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O07"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B05",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bottle",
              "dining chair",
              "dining table",
              "drinking glass",
              "light fixture",
              "service counter",
              "smartphone",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_nighttime_ambience",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A low-key nighttime setting at a seaside restaurant. The ambient environment is enveloped in deep blue-black shadows and earthy-neutral tones. Distant lights, such as those from fishing boats, provide subtle background accents against the dark surroundings.",
                "applies_to_shots": [
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "low-key nighttime setting, held within a restrained blue-black and earthy-neutral palette",
                  "Low-key nighttime contrast",
                  "distant fishing-boat lights remain small background accents"
                ],
                "visual_inferences": [
                  "The darkness of the background remains consistent to isolate and highlight the foreground subjects and specific light sources like the phone screen."
                ],
                "creative_decisions": [
                  "Using the distant fishing boat lights to add depth to the otherwise dark and shadowy seaside background."
                ],
                "confidence": "high"
              },
              {
                "element_id": "restaurant_table",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A dining table located at the seaside restaurant where the characters are gathered. The table anchors the space between the individuals, serving as the central surface over which they interact.",
                "applies_to_shots": [
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "the table and surrounding figures fall outside the focal plane",
                  "rising along the established table side"
                ],
                "visual_inferences": [
                  "The table's position is fixed in the lower section of the layout, acting as a structural element for the characters' seating arrangement."
                ],
                "creative_decisions": [
                  "The table may occasionally fall out of focus when the camera isolates specific objects or facial reactions, but its presence consistently grounds the scene's spatial layout."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 22,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L18B05",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7ca3569d8f6e2621"
      },
      {
        "scene_index": 49,
        "heading": "50. 실내. 해안마을 횟집 - 밤",
        "beat_title": "형사들의 깨달음과 긴장",
        "representative_moment": "조 형사와 신 형사가 휴대폰의 CCTV 캡처 사진을 확인한 뒤, 놀란 표정으로 서로의 눈을 맞추는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A balanced medium two-shot from an eye-level observer position on the shared frontal axis, low-key nighttime contrast",
            "t2i_prompt": "Photorealistic cinematic still. A balanced medium two-shot from an eye-level observer position on the shared frontal axis. An East Asian middle-aged man in a dark jacket sits to frame left at a three-quarter angle from the right, and an East Asian young man in a light jumper sits to frame right, leaning forward at a three-quarter angle from the left. They share a wooden dining table crossing the lower frame. Both men are lifting their chins from an unseen smartphone just below the edge, their eyes fixed on each other with startled expressions. The ambient environment is a low-key nighttime setting at a seaside restaurant enveloped in deep blue-black shadows and earthy-neutral tones. The dining table anchors the space between the individuals, holding a bottle and a drinking glass. Through the window behind them, a dark sea is visible with small distant fishing-boat lights providing subtle background accents against the dark surroundings.",
            "outfit_assignments": [],
            "source_facts": [
              "조 형사와 신 형사가 핸드폰을 보다 서로 마주본다",
              "두 사람을 알아보는 것 같은 표정들",
              "low-key nighttime setting at a seaside restaurant enveloped in deep blue-black shadows and earthy-neutral tones"
            ],
            "visual_inferences": [
              "The crane finishes rising along the established table side and settles at the seated eye line on the detectives’ shared frontal axis",
              "The dining table anchors the space between the individuals"
            ],
            "creative_decisions": [
              "Symmetrical framing to emphasize their simultaneous realization and shared tension",
              "Low-key nighttime contrast isolates their startled expressions while keeping the distant sea faint"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bottle",
                "usage_kind": "anchor",
                "source_phrase": "holding a bottle"
              },
              {
                "owned_token": "dining chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dining table",
                "usage_kind": "anchor",
                "source_phrase": "share a wooden dining table crossing the lower frame"
              },
              {
                "owned_token": "drinking glass",
                "usage_kind": "anchor",
                "source_phrase": "and a drinking glass"
              },
              {
                "owned_token": "light fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "service counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "anchor",
                "source_phrase": "unseen smartphone just below the edge"
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "Through the window behind them"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "cf0492f0692c79e5",
              "owned_hash": "97f55b084072415e",
              "camera_direction_hash": "d2d51b0d66f7074c",
              "owned_usage_hash": "40bd2334dc575674",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bottle",
                  "violating_phrase": "holding a bottle",
                  "reason": "The prompt mentions the dining table holding a bottle, which references the pre-existing bottle as a spatial anchor on the table without redrawing it, matching the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "dining table",
                  "violating_phrase": "wooden dining table crossing the lower frame",
                  "reason": "The dining table is referenced as a spatial anchor to position the two characters and describe the scene's composition, aligning with the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "drinking glass",
                  "violating_phrase": "holding a bottle and a drinking glass",
                  "reason": "The drinking glass is mentioned alongside the bottle as a pre-existing object resting on the table, used as a reference rather than being redrawn, matching the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "unseen smartphone just below the edge",
                  "reason": "The smartphone is explicitly described as unseen below the frame edge, used only to anchor the characters' poses, matching the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "Through the window behind them",
                  "reason": "The prompt references the pre-existing window to describe the view outside, serving as a compositional anchor, matching the producer's echo.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 22,
        "dependency_reason": "동일한 해안마을 횟집 배경 및 인물들의 좌석 배치 유지 (exact_background 연속성)",
        "_shot_index": 8,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 49,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The crane finishes rising along the established table side and settles at the seated eye line on the detectives’ shared frontal axis, framing both men in a balanced medium two-shot. 조 형사 sits to frame left and 신 형사 to frame right as their chins lift from the unseen phone and their eyes meet; the sole emphasized change is the redirected gaze.",
            "lighting_mood": "Low-key nighttime contrast isolates the detectives’ startled expressions while the distant fishing-boat lights remain small background accents.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B05",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bottle",
              "dining chair",
              "dining table",
              "drinking glass",
              "light fixture",
              "service counter",
              "smartphone",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_nighttime_ambience",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A low-key nighttime setting at a seaside restaurant. The ambient environment is enveloped in deep blue-black shadows and earthy-neutral tones. Distant lights, such as those from fishing boats, provide subtle background accents against the dark surroundings.",
                "applies_to_shots": [
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "low-key nighttime setting, held within a restrained blue-black and earthy-neutral palette",
                  "Low-key nighttime contrast",
                  "distant fishing-boat lights remain small background accents"
                ],
                "visual_inferences": [
                  "The darkness of the background remains consistent to isolate and highlight the foreground subjects and specific light sources like the phone screen."
                ],
                "creative_decisions": [
                  "Using the distant fishing boat lights to add depth to the otherwise dark and shadowy seaside background."
                ],
                "confidence": "high"
              },
              {
                "element_id": "restaurant_table",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A dining table located at the seaside restaurant where the characters are gathered. The table anchors the space between the individuals, serving as the central surface over which they interact.",
                "applies_to_shots": [
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "the table and surrounding figures fall outside the focal plane",
                  "rising along the established table side"
                ],
                "visual_inferences": [
                  "The table's position is fixed in the lower section of the layout, acting as a structural element for the characters' seating arrangement."
                ],
                "creative_decisions": [
                  "The table may occasionally fall out of focus when the camera isolates specific objects or facial reactions, but its presence consistently grounds the scene's spatial layout."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 22,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L18B05",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "39e153cc3e9d9aed"
      },
      {
        "scene_index": 50,
        "heading": "실내. 반월 식당 뒷방 - 밤",
        "beat_title": "고립감을 느끼는 감시망 확인",
        "representative_moment": "어두운 방 안에서 커튼 틈 사이로 골목길을 감시하는 마을 청년들을 내다보는 시점.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level subjective POV through a narrow gap, wide lens with out-of-focus foreground edges, cool high-contrast low-key lighting.",
            "t2i_prompt": "Photorealistic cinematic still. Through the narrow curtain opening in the middle-center foreground, the camera peers out from the deep shadow into a dimly lit alley. The slightly worn, semi-opaque fabric of the window curtain forms soft, out-of-focus dark near-frame boundaries on the left and right sides. Across the alley in the middle distance, Asian young men in casual outdoor clothing stand full-bodied in staggered positions at three-quarter angle from the left. Their eyes are fixed on the restaurant window, holding their ground. Nighttime ambient light is kept low-key and restrained, with the curtain edges dropping into profound high contrast against the faint moonlight and distant street lamps illuminating the alley exterior.",
            "outfit_assignments": [],
            "source_facts": [
              "수리영이 커튼을 슬쩍 걷어 창밖을 몰래 내다본다.",
              "골목길에서 마치 수리영 쪽을 감시하는 것만 같이 서 있는 마을 청년 둘.",
              "어두운 방 안"
            ],
            "visual_inferences": [
              "fixed_element window_curtain: worn semi-opaque fabric framing the gap",
              "fixed_element dark_room_lighting: heavy shadows with high-contrast ambient lighting",
              "The youths are wearing practical clothes for a night vigil in an island village."
            ],
            "creative_decisions": [
              "Using the curtain edges as an extreme foreground framing device to emphasize the subjective, voyeuristic POV of the trapped character.",
              "Contrasting the pitch-black interior with the cool, dim light of the alley to visually isolate the room."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "9c7f642c0f1e6807",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "5d8bb3c54a728bb9",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 50,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level immediately beside the window, a wider lens peers through the narrow curtain opening, retaining both curtain edges as soft near-frame boundaries. The village youths appear full-bodied across the alley in the middle distance, spaced so their fixed attention toward the restaurant reads clearly without exposing the watcher inside.",
            "lighting_mood": "Nighttime ambient light is kept low-key and restrained, with the curtain edges dropping into deep contrast around the alley view.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "narrow curtain opening",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "window_curtain",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A fabric curtain covering the window of the dark back room. It has a slightly worn, semi-opaque texture that serves as a physical and visual barrier between the dim interior and the outside alley. The curtain's fabric is manipulated to create a narrow gap for peering outside, maintaining its presence near the frame edges.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "수리영이 커튼을 슬쩍 걷어 창밖을 몰래 내다본다.",
                  "retaining both curtain edges as soft near-frame boundaries",
                  "clenched hand on the curtain"
                ],
                "visual_inferences": [
                  "The curtain is made of a heavy enough material to block most outside light and effectively hide the person inside.",
                  "It appears as an ordinary, slightly aged curtain typical of an old restaurant's back room."
                ],
                "creative_decisions": [
                  "The curtain is used as a prominent visual framing device in the POV shot and acts as a focal anchor for the character's physical tension in the reaction shot."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_room_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the room is draped in heavy shadows with low-key, high-contrast ambient lighting. Minimal illumination seeps in from the window, keeping the room profoundly dark and emphasizing a tense, isolated nighttime atmosphere.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "어두운 방 안",
                  "Nighttime ambient light is kept low-key and restrained",
                  "The dark room is rendered in low-key, high-contrast ambient light"
                ],
                "visual_inferences": [
                  "There are no active indoor light fixtures turned on.",
                  "The faint moonlight and distant alley lights provide the only weak sources of illumination near the window."
                ],
                "creative_decisions": [
                  "The deep contrast isolates the window area as the sole visual connection to the outside world, visually heightening the character's feeling of entrapment."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "991fbc73d56b1c8e"
      },
      {
        "scene_index": 50,
        "heading": "실내. 반월 식당 뒷방 - 밤",
        "beat_title": "고립감을 느끼며 커튼을 움켜쥔 수리영",
        "representative_moment": "어두운 방 안에서 긴장한 표정으로 창문 커튼을 꽉 쥔 동아시아인 젊은 여성의 모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "close composition at eye level, low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. An East Asian young woman at a three-quarter angle from the right, her face occupying the upper-middle of the frame with a tense expression, looking off-screen. Her clenched hand grips a slightly worn, semi-opaque fabric curtain in the lower side of the frame, twisting her body away. The room-facing folds of the curtain and the fabric caught in her fist are clearly visible. Behind her, [: the dark room-facing side of the window immediately behind her, acting as a soft near-frame boundary]. The scene is rendered in low-key, high-contrast ambient light, with minimal illumination seeping through the curtain edges, casting heavy shadows across her features and emphasizing the gripping hand.",
            "outfit_assignments": [],
            "source_facts": [
              "수리영이 커튼을 닫고 어두운 방 안을 서성이는 수리영.",
              "clenched hand on the curtain",
              "어두운 방 안"
            ],
            "visual_inferences": [
              "fixed_element body_full_pose: twisting while clutching curtain",
              "fixed_element window_curtain: slightly worn, semi-opaque texture, manipulated to create a narrow gap",
              "fixed_element dark_room_lighting: minimal illumination seeps in from the window, emphasizing a tense atmosphere"
            ],
            "creative_decisions": [
              "close framing isolates her face and clenched hand to heighten claustrophobic tension",
              "low-key, high-contrast lighting is concentrated on her face and the curtain to preserve the dark room environment"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0813681a08bc6817",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "fb44886cd526a11d",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 50,
        "dependency_reason": "continuous exact background location and moment from the prior shot",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 50,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From inside the room at eye level, the static camera faces the window and tightens to a close composition as 김지후 turns away from it, placing her face in the upper-middle and her clenched hand on the curtain within the lower side of frame. She is held at a slight three-quarter angle rather than square-on, with the grip and expression sharing focus at the instant the curtain closes.",
            "lighting_mood": "The dark room is rendered in low-key, high-contrast ambient light, preserving her tense features and gripping hand without introducing an unsupported source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "window_curtain",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A fabric curtain covering the window of the dark back room. It has a slightly worn, semi-opaque texture that serves as a physical and visual barrier between the dim interior and the outside alley. The curtain's fabric is manipulated to create a narrow gap for peering outside, maintaining its presence near the frame edges.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "수리영이 커튼을 슬쩍 걷어 창밖을 몰래 내다본다.",
                  "retaining both curtain edges as soft near-frame boundaries",
                  "clenched hand on the curtain"
                ],
                "visual_inferences": [
                  "The curtain is made of a heavy enough material to block most outside light and effectively hide the person inside.",
                  "It appears as an ordinary, slightly aged curtain typical of an old restaurant's back room."
                ],
                "creative_decisions": [
                  "The curtain is used as a prominent visual framing device in the POV shot and acts as a focal anchor for the character's physical tension in the reaction shot."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_room_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the room is draped in heavy shadows with low-key, high-contrast ambient lighting. Minimal illumination seeps in from the window, keeping the room profoundly dark and emphasizing a tense, isolated nighttime atmosphere.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "어두운 방 안",
                  "Nighttime ambient light is kept low-key and restrained",
                  "The dark room is rendered in low-key, high-contrast ambient light"
                ],
                "visual_inferences": [
                  "There are no active indoor light fixtures turned on.",
                  "The faint moonlight and distant alley lights provide the only weak sources of illumination near the window."
                ],
                "creative_decisions": [
                  "The deep contrast isolates the window area as the sole visual connection to the outside world, visually heightening the character's feeling of entrapment."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 50,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "8008e570511e3447"
      },
      {
        "scene_index": 51,
        "heading": "52. 실내. 동굴 - 밤",
        "beat_title": "단절된 가치관과 외면",
        "representative_moment": "어두운 동굴 안, 고산들이 쇠사슬에 묶인 채 애원하는 강민숙을 차갑게 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height oblique observer composition emphasizing vertical emotional imbalance with hard contrast lighting",
            "t2i_prompt": "Photorealistic cinematic still. From an observer's standing chest-height perspective on an oblique axis, an East Asian man in his 30s in a dark jacket occupies one side of the midground at full height, his weight settled over his heels at three-quarter angle from the left, looking down at the woman. Across the shared dark cave floor opposite him, an East Asian woman in her 40s in worn clothes kneels low in three-quarter right profile, looking up at the man. She has an extremely haggard and exhausted face with messy, unkempt hair. The chains in the cave are wrapped around her upper body and neck area, pulling taut. A single low-wattage bare light bulb hangs above, illuminating the rough-walled rocky cave interior, casting a confined low-key pool of hard contrast over the bound figure and the man's downward gaze, leaving deep heavy shadows in the surrounding space.",
            "outfit_assignments": [],
            "source_facts": [
              "S52 action: 산들이 안타까운 시선으로 민숙을 내려다본다.",
              "shot description: 고산들이 바닥에 묶인 강민숙을 묵묵히 내려다보는 전신.",
              "S52 environment: 실내. 동굴 - 밤, 촉 낮은 전구 등, 쇠사슬에 묶인 상태"
            ],
            "visual_inferences": [
              "fixed_element character_state: minsook_bound_haggard_state (haggard face, unkempt hair, chains taut)",
              "fixed_element environment_state: cave_low_lighting_environment (rough-walled, confined high-contrast pool of light)",
              "Shared surface anchor (cave floor) to integrate foreground and background figures in wide framing"
            ],
            "creative_decisions": [
              "Vertical separation in the midground to carry the emotional imbalance between the standing man and kneeling woman.",
              "Low-key hard contrast lighting to heighten the sense of isolation and despair within the cave."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "anchor ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chain",
                "usage_kind": "anchor",
                "source_phrase": "The chains in the cave are wrapped around her upper body and neck area, pulling taut."
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "Across the shared dark cave floor opposite him"
              },
              {
                "owned_token": "light bulb",
                "usage_kind": "anchor",
                "source_phrase": "A single low-wattage bare light bulb hangs above"
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "illuminating the rough-walled rocky cave interior"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "335eed05f1312647",
              "owned_hash": "17619af61a3641b1",
              "camera_direction_hash": "541a25a925015f95",
              "owned_usage_hash": "6a551ff4d8bd9faa",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "chain",
                  "violating_phrase": "The chains in the cave are wrapped around her upper body and neck area, pulling taut.",
                  "reason": "The prompt describes the physical interaction geometry of the chains wrapped around the character's body without modifying their core design, satisfying the exception for allowed prop contact.",
                  "verdict": "allowed_prop_contact"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "Across the shared dark cave floor opposite him",
                  "reason": "The floor is used strictly as a spatial reference to position the character, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "light bulb",
                  "violating_phrase": "A single low-wattage bare light bulb hangs above",
                  "reason": "The light bulb is referenced to establish the lighting environment and composition, without any instruction to redesign or redraw it.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "illuminating the rough-walled rocky cave interior",
                  "reason": "The wall is mentioned descriptively to guide the rendering of the illumination, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 37,
        "dependency_reason": "이전 샷(S37_Shot5)의 공간/조명(동굴 배경)과 연속성을 유지하기 위해 exact_background 참조 적용",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 51,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From standing chest height on the prescribed oblique axis, a static wide frame includes 고산들 at full height in one side of the midground and the chained 강민숙 low on the cave floor opposite him. Their vertical separation carries the emotional imbalance, while enough open space remains between them for the later forward move along their shared eyeline.",
            "lighting_mood": "A lit low-watt bulb creates a confined low-key pool with hard contrast around the bound figure and 고산들’s downward gaze.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L30B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "anchor ring",
              "chain",
              "door",
              "floor",
              "light bulb",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cave_low_lighting_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, rough-walled rocky cave interior at night. A single, low-wattage bare light bulb hangs and illuminates the space, casting a very confined, high-contrast pool of light that creates deep, heavy shadows in the surrounding area.",
                "applies_to_shots": [
                  2,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실내. 동굴 - 밤",
                  "촉 낮은 전구 등이 불을 밝히자",
                  "creates a confined low-key pool with hard contrast"
                ],
                "visual_inferences": [
                  "The cave walls have a rough, natural stone texture."
                ],
                "creative_decisions": [
                  "Emphasizing the extreme contrast between the small illuminated area and the absolute darkness of the background to heighten the sense of isolation and despair."
                ],
                "confidence": "high"
              },
              {
                "element_id": "minsook_bound_haggard_state",
                "element_type": "character_state",
                "character_name": "강민숙(홍은미)",
                "description": "The woman has an extremely haggard and exhausted face with messy, unkempt hair. Thick, heavy metal chains are visibly wrapped around her upper body and neck area, pulling taut and physically restricting her.",
                "applies_to_shots": [
                  2,
                  7
                ],
                "element_scope": "close",
                "source_facts": [
                  "초췌한 몰골",
                  "쇠사슬에 묶인 상태",
                  "kneeling with chains taut",
                  "straining forward against chains"
                ],
                "visual_inferences": [
                  "The heavy chains are made of dark, unpolished iron.",
                  "Her complexion is pale and dirty due to prolonged captivity."
                ],
                "creative_decisions": [
                  "Focusing the persistent state on her upper body and facial distress to allow compatibility with both wide kneeling shots and tight foreground profile shots without breaking composition."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 37,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L30B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "731935e5171d34d8"
      },
      {
        "scene_index": 51,
        "heading": "실내. 동굴 - 밤",
        "beat_title": "절박한 애원과 차가운 외면",
        "representative_moment": "In a tight close-up, Minsook strains forward against her chains with a desperate plea, while Sandeul walks away into the dark background, his back turned.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close framing with a soft out-of-focus background and high-contrast low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. Captured at an eye-level close framing, an Asian middle-aged woman occupies the large foreground in left three-quarter profile, sharing the same rough-walled rocky cave interior with a figure behind her. The woman has an extremely haggard and exhausted face with messy, unkempt hair. Thick, heavy metal chains are visibly wrapped around her upper body and neck area, pulling taut and physically restricting her as she strains forward. Her mouth is open in a desperate plea, eyes fixed on the man ahead. Across the shared cave floor, an Asian young man appears as a soft out-of-focus silhouette in the background, with his back to the camera, caught departing mid-stride toward the deeper darkness. A single low-wattage bare light bulb casts a very confined, high-contrast pool of light over the woman's face and the taut chains, creating deep, heavy shadows in the surrounding frame-edge rocky area where the man recedes.",
            "outfit_assignments": [],
            "source_facts": [
              "실내. 동굴 - 밤",
              "초췌한 몰골, 쇠사슬에 묶인 상태",
              "산들이 뒤돌아 나간다",
              "제발 부탁해... 산들아!!"
            ],
            "visual_inferences": [
              "The heavy chains are made of dark, unpolished iron.",
              "Her complexion is pale and dirty due to prolonged captivity.",
              "Sandeul is rendered as a soft silhouette due to the close framing rules and lighting setup."
            ],
            "creative_decisions": [
              "Used a close framing with an out-of-focus background character to maintain the fg/bg separation while adhering to the primary_framing_rule for close shots.",
              "Integrated the 'cave_low_lighting_environment' and 'minsook_bound_haggard_state' fixed elements verbatim to ensure continuity.",
              "Emphasized the motion direction of the departing figure by describing him caught mid-stride."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "anchor ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light bulb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "15765be3a06a57d3",
              "owned_hash": "17619af61a3641b1",
              "camera_direction_hash": "8afe9fbaffaaa3d2",
              "owned_usage_hash": "cde6f591a33de10d",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 51,
        "dependency_reason": "Relies on the established cave environment and the character's bound state from previous shots in the same scene.",
        "_shot_index": 7,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 51,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 강민숙’s eye level, the camera stays close beside her face and angles past her toward 고산들 several meters ahead, placing her strained profile large in the foreground and his turned back smaller in the background. The static depth composition keeps both her open-mouthed plea and his refusal to turn readable in one frame.",
            "lighting_mood": "The low-watt bulb keeps 강민숙’s pleading face in a constrained high-contrast pool while 고산들 recedes into reduced illumination.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L30B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cave_low_lighting_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, rough-walled rocky cave interior at night. A single, low-wattage bare light bulb hangs and illuminates the space, casting a very confined, high-contrast pool of light that creates deep, heavy shadows in the surrounding area.",
                "applies_to_shots": [
                  2,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실내. 동굴 - 밤",
                  "촉 낮은 전구 등이 불을 밝히자",
                  "creates a confined low-key pool with hard contrast"
                ],
                "visual_inferences": [
                  "The cave walls have a rough, natural stone texture."
                ],
                "creative_decisions": [
                  "Emphasizing the extreme contrast between the small illuminated area and the absolute darkness of the background to heighten the sense of isolation and despair."
                ],
                "confidence": "high"
              },
              {
                "element_id": "minsook_bound_haggard_state",
                "element_type": "character_state",
                "character_name": "강민숙(홍은미)",
                "description": "The woman has an extremely haggard and exhausted face with messy, unkempt hair. Thick, heavy metal chains are visibly wrapped around her upper body and neck area, pulling taut and physically restricting her.",
                "applies_to_shots": [
                  2,
                  7
                ],
                "element_scope": "close",
                "source_facts": [
                  "초췌한 몰골",
                  "쇠사슬에 묶인 상태",
                  "kneeling with chains taut",
                  "straining forward against chains"
                ],
                "visual_inferences": [
                  "The heavy chains are made of dark, unpolished iron.",
                  "Her complexion is pale and dirty due to prolonged captivity."
                ],
                "creative_decisions": [
                  "Focusing the persistent state on her upper body and facial distress to allow compatibility with both wide kneeling shots and tight foreground profile shots without breaking composition."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 51,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "97742b0c80213d4e"
      },
      {
        "scene_index": 52,
        "heading": "실외. 숲속 만월제 도당 - 밤",
        "beat_title": "거대 바위 앞에서의 간절한 기도",
        "representative_moment": "C08이 피 묻은 거대 바위 앞에 무릎을 꿇고 두 손을 댄 채 간절히 기도를 올리고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide static shot from adult eye height directly behind the subject, severe low-key contrast",
            "t2i_prompt": "Photorealistic cinematic still. Kneeling C08O11 in a dark jacket, a Korean man in his mid-40s with short cropped black hair, occupies the lower-center foreground with his back to the camera. A blood-marked giant boulder dominates the upper-center background. His upper body faces forward along a shared central axis, head bowed deeply toward the ground, looking down. Both of his arms are extended straight out in front of him, open palms pressed flat against the rough surface of the boulder. The massive stone is smeared with dark red, dried animal blood, leaving distinct marks resembling human handprints. A bare tree frames the edge of the open forest clearing. The nighttime space is illuminated by severe low-key contrast, casting a restrained blue-black and deep-red cinematic palette over the ritual scene.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "바위 앞에 꿇어앉은 산들이 두 손을 뻗어 바위에 갖다댄다.",
              "고개를 푹 숙인 채 간절히 기도한다.",
              "성인 키 서너 배 높이의 거대한 바위가 떡하니 자리잡고 있다."
            ],
            "visual_inferences": [
              "fixed_element sandeul_praying_posture: kneeling on the ground with upper body facing forward, arms extended, palms flat against the boulder",
              "fixed_element giant_blood_marked_boulder: massive towering boulder, rough stone smeared with dark red dried blood",
              "observer POV from far behind, centering the shared axis between the kneeling figure and the rock"
            ],
            "creative_decisions": [
              "Severe low-key lighting with blue-black and earthy-neutral tones emphasizes the eerie, imposing presence of the blood-smeared boulder against the small human scale reference."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "boulder",
                "usage_kind": "anchor",
                "source_phrase": "blood-marked giant boulder dominates the upper-center background"
              },
              {
                "owned_token": "tree",
                "usage_kind": "anchor",
                "source_phrase": "A bare tree frames the edge of the open forest clearing"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1fd3bf645e65832d",
              "owned_hash": "3b4d2b904990eb59",
              "camera_direction_hash": "393a46fbf71f359c",
              "owned_usage_hash": "99d787464b3e63b9",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "boulder",
                  "violating_phrase": "A blood-marked giant boulder... The massive stone is smeared with dark red, dried animal blood, leaving distinct marks resembling human handprints.",
                  "reason": "The prompt details blood smears on the boulder's surface, which qualifies as a visual state change. This is allowed because the shot intent explicitly demands a blood-stained giant boulder ('피 묻은 거대 바위').",
                  "verdict": "allowed_visual_state_change"
                },
                {
                  "owned_object": "tree",
                  "violating_phrase": "A bare tree frames the edge of the open forest clearing.",
                  "reason": "The tree is mentioned solely to establish the composition and frame the clearing without any instructions to redraw or modify its structure, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 2,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 52,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From adult eye height far behind 고산들, the static wide frame is centered precisely on the shared axis between his kneeling body and the enormous boulder. His back occupies the lower center as a small human scale reference, while the blood-marked rock rises through the central background without being cropped.",
            "lighting_mood": "The nighttime clearing is treated with severe low-key contrast and a restrained blue-black, earthy-neutral, and deep-red palette around the blood-marked boulder.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "blood-marked giant boulder",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "kneeling 고산들",
                  "screen_zone": "lower_center",
                  "target_id": "C08",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "boulder",
              "tree"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sandeul_praying_posture",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "A young Korean man is kneeling on the ground with his upper body facing forward. His head is bowed deeply toward the ground. Both of his arms are extended straight out in front of him, and his open palms are pressed flat against the rough surface of a massive boulder.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "바위 앞에 꿇어앉은 산들이 두 손을 뻗어 바위에 갖다댄다.",
                  "고개를 푹 숙인 채 간절히 기도한다."
                ],
                "visual_inferences": [
                  "His kneeling position is firmly grounded, and his arms remain locked in a static, extended posture of devotion."
                ],
                "creative_decisions": [
                  "The posture emphasizes his profound desperation and submission to a transcendent entity, readable both from behind and in profile."
                ],
                "confidence": "high"
              },
              {
                "element_id": "giant_blood_marked_boulder",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A massive, towering boulder dominates a dark forest clearing at night. The rough stone surface of the giant rock is heavily smeared with dark red, dried animal blood, leaving distinct marks that resemble the shape of human handprints scattered across it.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "성인 키 서너 배 높이의 거대한 바위가 떡하니 자리잡고 있다.",
                  "바위 곳곳에는 사람 손바닥으로 잔뜩 처 바른 것 같은 검붉은 동물의 피 흔적."
                ],
                "visual_inferences": [
                  "The dark red blood marks contrast distinctly with the dark, earthy tones of the boulder under the dim nighttime conditions."
                ],
                "creative_decisions": [
                  "The boulder acts as an imposing central visual anchor in the clearing, illuminated by severe low-key contrast to enhance its eerie presence."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L35B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "e2286c6dbee3ee22"
      },
      {
        "scene_index": 52,
        "heading": "실외. 숲속 만월제 도당 - 밤",
        "beat_title": "피 묻은 거대 바위 앞에서의 기도",
        "representative_moment": "C08이 피 묻은 거대 바위 앞에 꿇어앉아 두 손을 뻗어 바위에 댄 채 고개를 숙이고 기도하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "head height close side profile, low-key nighttime contrast",
            "t2i_prompt": "Photorealistic cinematic still. C08O11 in a dark jacket, a Korean middle-aged man with short black hair and a square jaw, is isolated in prayer in the middle-center foreground. Captured at head height in left profile, his upper body faces forward with his head bowed deeply toward the ground, looking down. His bowed face and lowered shoulders occupy the left side of the frame. Both of his arms are extended straight out in front of him, remaining partially visible as his open palms press flat against [: the rough stone surface of a massive boulder, heavily smeared with dark red dried animal blood resembling handprints] located at the right frame edge. The background is a dark forest clearing at night, rendered as a soft out-of-focus silhouette due to the close framing. Low-key nighttime contrast shapes his bowed profile and prayer posture, illuminated by restrained earthy neutrals while deep red traces are retained on the adjacent stone surface.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "바위 앞에 꿇어앉은 산들이 두 손을 뻗어 바위에 갖다댄다.",
              "고개를 푹 숙인 채 간절히 기도한다."
            ],
            "visual_inferences": [
              "fixed_element sandeul_praying_posture: kneeling with upper body facing forward, arms extended, palms pressed against boulder",
              "fixed_element giant_blood_marked_boulder: rough stone surface smeared with dark red blood resembling handprints",
              "close framing renders the background forest clearing out of focus while keeping the frame-edge boulder surface sharp"
            ],
            "creative_decisions": [
              "head height close side profile to emphasize the bowed face occupying one side of the frame",
              "low-key nighttime lighting with earthy neutrals and deep red contrast applied to the boulder marks"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "boulder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "462fa4382b214248",
              "owned_hash": "3b4d2b904990eb59",
              "camera_direction_hash": "ec81446aa1173a30",
              "owned_usage_hash": "5840f41f4b7f6c67",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 52,
        "dependency_reason": "S52_Shot2의 숲속 공터 환경과 피 묻은 거대 바위의 일관성을 유지하되, close framing 규칙에 따라 배경은 out-of-focus 처리하고 바위 표면은 frame edge에 배치함",
        "_shot_index": 4,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 52,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The tracking move completes perpendicular to 고산들’s line toward the boulder and settles near head height in a close side profile. His bowed face occupies one side of frame while his lowered shoulders and extended arms remain partially visible, preserving the bodily shape of prayer rather than isolating the expression alone.",
            "lighting_mood": "Low-key nighttime contrast shapes the bowed profile and prayer posture, with restrained earthy neutrals and deep red retained on the adjacent boulder marks.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "고산들 isolated in prayer",
                  "screen_zone": "middle_center",
                  "target_id": "C08",
                  "target_kind": "character"
                }
              ]
            },
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L35B04",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sandeul_praying_posture",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "A young Korean man is kneeling on the ground with his upper body facing forward. His head is bowed deeply toward the ground. Both of his arms are extended straight out in front of him, and his open palms are pressed flat against the rough surface of a massive boulder.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "바위 앞에 꿇어앉은 산들이 두 손을 뻗어 바위에 갖다댄다.",
                  "고개를 푹 숙인 채 간절히 기도한다."
                ],
                "visual_inferences": [
                  "His kneeling position is firmly grounded, and his arms remain locked in a static, extended posture of devotion."
                ],
                "creative_decisions": [
                  "The posture emphasizes his profound desperation and submission to a transcendent entity, readable both from behind and in profile."
                ],
                "confidence": "high"
              },
              {
                "element_id": "giant_blood_marked_boulder",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A massive, towering boulder dominates a dark forest clearing at night. The rough stone surface of the giant rock is heavily smeared with dark red, dried animal blood, leaving distinct marks that resemble the shape of human handprints scattered across it.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "성인 키 서너 배 높이의 거대한 바위가 떡하니 자리잡고 있다.",
                  "바위 곳곳에는 사람 손바닥으로 잔뜩 처 바른 것 같은 검붉은 동물의 피 흔적."
                ],
                "visual_inferences": [
                  "The dark red blood marks contrast distinctly with the dark, earthy tones of the boulder under the dim nighttime conditions."
                ],
                "creative_decisions": [
                  "The boulder acts as an imposing central visual anchor in the clearing, illuminated by severe low-key contrast to enhance its eerie presence."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 52,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "5d0022672d53920a"
      },
      {
        "scene_index": 53,
        "heading": "실외. 해안마을 선착장 - 낮",
        "beat_title": "입도 거절과 팽팽한 대치",
        "representative_moment": "황 씨가 단호한 표정으로 한 손을 뻗어 인우의 앞을 가로막으며 입도를 거절하는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Observer viewpoint at upper-body height, restrained contrast with earthy neutral colors",
            "t2i_prompt": "Photorealistic cinematic still. Captured at upper-body height with torsos and heads occupying the frame. An elderly Asian man in weathered marine work clothes stands near the center at a three-quarter angle from the right, his deeply furrowed brows and heavily scowling face showing intense annoyance. One bare palm is firmly extended outward in a gesture of refusal, his eyes fixed on a young Asian man near the opposite edge of the frame. The young Asian man, dressed in a multi-pocketed fishing vest and casual outdoor clothing, stands at a three-quarter angle from the left, his jaw firmly set with a tense, aggressive expression and his weight shifted forward. They face each other across the weathered wooden rail of a moored fishing boat, sharing the tense physical space as the extended palm arrests the visual line between them. Natural daytime ambient light bathes the scene with restrained contrast and earthy neutral tones, highlighting the aged wooden and metal textures of the vessel against the subdued coastal dock in the background.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: 황봉업(황 씨)이 정인우를 향해 한 손을 바깥쪽으로 뻗어 거절하는 자세로 멈춰 있는 찰나",
              "scene text: 누가봐도 낚싯꾼 코스프레를 한 인우가 인상을 잔뜩 쓴 채 어선 위 황 씨를 노려본다",
              "scene text: 인상을 잔뜩 구긴 황봉업(황 씨)"
            ],
            "visual_inferences": [
              "fixed_element inwoo_fisherman_disguise: young man in multi-pocketed fishing vest and casual outdoor clothing, aggressive expression, jaw firmly set",
              "fixed_element hwang_boat_operator_appearance: older local man in weathered marine work clothes, deeply annoyed facial expression",
              "fixed_element coastal_dock_daytime: restrained earthy-neutral color palette, moored fishing boat at a coastal dock under daytime ambient light"
            ],
            "creative_decisions": [
              "Placed both figures across the weathered wooden rail of the boat as a shared spatial anchor to emphasize their proximity and confrontation",
              "Positioned the older man's extended palm centrally to physically and visually block the space between them",
              "Kept the lighting flat and earthy to reflect the grounded, bleak reality of the local village rather than a bright vacation spot"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "cad924d02413efef",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "96cc78e563085b74",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 53,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Tracking from the dock-facing side of the boat, the camera finishes at 황봉업’s upper-body height in a medium two-shot, with him closer to frame center and 정인우 held across the confrontation axis near the opposite edge. 황봉업’s outward palm arrests the visual line between them while 정인우’s forward-set posture keeps the refusal from reading as casual conversation.",
            "lighting_mood": "Natural daytime ambient light appropriate to the dock is shaped with restrained contrast and earthy neutral color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "inwoo_fisherman_disguise",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A young man dressed in a complete fisherman's disguise, including a functional fishing vest and casual outdoor clothing. His face consistently displays a highly tense, aggressive expression with a firmly set jaw.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "누가봐도 낚싯꾼 코스프레를 한 인우가 인상을 잔뜩 쓴 채",
                  "jaw set",
                  "tense face"
                ],
                "visual_inferences": [
                  "The disguise includes a multi-pocketed fishing vest and practical outdoor wear.",
                  "His aggressive facial expression contrasts with the casual outfit."
                ],
                "creative_decisions": [
                  "Maintaining a rigid facial tension to underscore his determination despite changing arm positions."
                ],
                "confidence": "high"
              },
              {
                "element_id": "hwang_boat_operator_appearance",
                "element_type": "character_state",
                "character_name": "황봉업",
                "description": "An older local man wearing weathered marine work clothes suitable for operating a fishing boat. He maintains a deeply annoyed, heavily scowling facial expression with furrowed brows.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "인상을 잔뜩 구긴 황봉업(황 씨)",
                  "짜증스레",
                  "우거지상이 된다"
                ],
                "visual_inferences": [
                  "Wearing practical, slightly faded work clothes typical for a local island boat operator."
                ],
                "creative_decisions": [
                  "Highlighting his deep facial wrinkles and consistent scowl to emphasize his hostile stance toward outsiders."
                ],
                "confidence": "high"
              },
              {
                "element_id": "coastal_dock_daytime",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A moored fishing boat at an outdoor coastal village dock under natural daytime ambient lighting. The scene is characterized by a restrained, earthy-neutral color palette that subdues the sunny environment.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 해안마을 선착장 - 낮",
                  "어선 위",
                  "Natural daytime ambient light",
                  "restrained earthy neutral color"
                ],
                "visual_inferences": [
                  "The boat features weathered wooden and metal textures typical of small fishing vessels."
                ],
                "creative_decisions": [
                  "Using restrained contrast and neutral tones to frame the tension without making the lighting overly dramatic."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "64f09ed141ff8a8f"
      },
      {
        "scene_index": 53,
        "heading": "실외. 해안마을 선착장 - 낮",
        "beat_title": "경찰 신분증 노출",
        "representative_moment": "정인우가 팔을 뻗어 경찰 신분증을 황 씨의 눈앞에 바짝 들이댄다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close depth composition at eye level with shallow depth of field, restrained earthy-neutral tones",
            "t2i_prompt": "Photorealistic cinematic still. A police identification beside Hwang's eyeline is positioned in the middle-center foreground, held out across the same narrow boat deck they both occupy. In the slightly out-of-focus background at a three-quarter angle from the right, a young Asian man in a multi-pocketed fishing vest extends his arm diagonally forward, his face highly tense with a firmly set jaw, eyes fixed on the older man. Occupying the close foreground space, an older Asian man in weathered marine work clothes leans toward the credential at a three-quarter left angle, his deeply annoyed and heavily scowling face sharply focused, looking off-screen. The credential face is angled partially toward the camera, making its official layout visible. The weathered wooden boat surface and a minimal slice of the daytime dock provide a soft edge to the frame under natural, restrained earthy-neutral ambient light.",
            "outfit_assignments": [],
            "source_facts": [
              "경찰 신분증을 꺼내 황 씨에게 들이민다.",
              "인상을 팍 쓰고 신분증을 보는 황 씨, 인우 신분을 알아보고 우거지상이 된다.",
              "DP: at 황봉업’s eye level, camera tracks immediately beside the line connecting his face to 정인우’s fully extended hand",
              "DP: 정인우’s tense face and shoulder sit deeper on one side, his arm drives diagonally forward",
              "DP: The credential face is angled toward 황봉업 and partially toward the camera"
            ],
            "visual_inferences": [
              "fixed_element inwoo_fisherman_disguise: young man in functional fishing vest, tense aggressive expression with a firmly set jaw",
              "fixed_element hwang_boat_operator_appearance: older local man in weathered marine work clothes, deeply annoyed scowling face",
              "fixed_element coastal_dock_daytime: restrained earthy-neutral daytime ambient light, weathered boat textures",
              "To comply with close framing spatial rules, the young man's face in the deep background is rendered slightly out of focus while the ID and older man remain sharp."
            ],
            "creative_decisions": [
              "Incorporated frame spatial contract fsc_001 directly into the first sentence to anchor the credential in the middle-center foreground.",
              "Employed a shallow depth of field to separate the foreground scowling face from the deep background tense face, maintaining a single-camera view constraint.",
              "Used restrained, earthy-neutral lighting to subdue the sunny setting and heighten the narrative tension."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a208a871cc88d7b3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9c5eb02e251a981f",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 53,
        "dependency_reason": "동일한 선착장 어선 위 배경 및 인물 의상 연속성 유지 (background exact match)",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 53,
            "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, the camera tracks immediately beside the line connecting his face to 정인우’s fully extended hand, ending in a close depth composition. 정인우’s tense face and shoulder sit deeper on one side, his arm drives diagonally forward, and the police identification remains near center beside 황봉업’s eyes without exceeding a natural portion of the frame.",
            "lighting_mood": "Natural daytime ambient light keeps the credential readable and the faces sharply separated within a restrained earthy-neutral palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "police identification beside Hwang’s eyeline",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "inwoo_fisherman_disguise",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A young man dressed in a complete fisherman's disguise, including a functional fishing vest and casual outdoor clothing. His face consistently displays a highly tense, aggressive expression with a firmly set jaw.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "누가봐도 낚싯꾼 코스프레를 한 인우가 인상을 잔뜩 쓴 채",
                  "jaw set",
                  "tense face"
                ],
                "visual_inferences": [
                  "The disguise includes a multi-pocketed fishing vest and practical outdoor wear.",
                  "His aggressive facial expression contrasts with the casual outfit."
                ],
                "creative_decisions": [
                  "Maintaining a rigid facial tension to underscore his determination despite changing arm positions."
                ],
                "confidence": "high"
              },
              {
                "element_id": "hwang_boat_operator_appearance",
                "element_type": "character_state",
                "character_name": "황봉업",
                "description": "An older local man wearing weathered marine work clothes suitable for operating a fishing boat. He maintains a deeply annoyed, heavily scowling facial expression with furrowed brows.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "인상을 잔뜩 구긴 황봉업(황 씨)",
                  "짜증스레",
                  "우거지상이 된다"
                ],
                "visual_inferences": [
                  "Wearing practical, slightly faded work clothes typical for a local island boat operator."
                ],
                "creative_decisions": [
                  "Highlighting his deep facial wrinkles and consistent scowl to emphasize his hostile stance toward outsiders."
                ],
                "confidence": "high"
              },
              {
                "element_id": "coastal_dock_daytime",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A moored fishing boat at an outdoor coastal village dock under natural daytime ambient lighting. The scene is characterized by a restrained, earthy-neutral color palette that subdues the sunny environment.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 해안마을 선착장 - 낮",
                  "어선 위",
                  "Natural daytime ambient light",
                  "restrained earthy neutral color"
                ],
                "visual_inferences": [
                  "The boat features weathered wooden and metal textures typical of small fishing vessels."
                ],
                "creative_decisions": [
                  "Using restrained contrast and neutral tones to frame the tension without making the lighting overly dramatic."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 53,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "3dede08f1bffedd7"
      },
      {
        "scene_index": 54,
        "heading": "실외. 황 씨의 낚시 어선 - 낮",
        "beat_title": "안개 속 어선과 황 씨의 짙은 적대감",
        "representative_moment": "조타실에서 키를 잡은 C11이 뱃머리에 서 있는 인물에게 적대감 가득한 시선을 쏘아본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Static medium side view from inside the wheelhouse at shoulder height, cold blue-black grade with high-contrast lighting on faces",
            "t2i_prompt": "Photorealistic cinematic still. C11O14, 황봉업(황 씨), in fisher workwear, a Korean man in his 50s, stands in the middle-left foreground, looking toward Jeong Inwoo on the bow. He is seen in right profile, shoulders tensed, his hands firmly gripping the ship's wooden steering wheel; the dashboard and central wheel assembly are visible in the lower frame. Through the shared wheelhouse window, the other figure, a young Korean man, stands on the advancing bow with his back to the camera, leaning forward and gazing into the distant sea. A thick, gray marine fog heavily obscures the surrounding environment, significantly reducing visibility across the water. The scene is immersed in muted daylight with a cold, blue-black color grade, shaping a restrained, high-contrast light on the foreground face against the subdued neutral wheelhouse interior, creating an ominous and oppressive atmosphere.",
            "outfit_assignments": [
              {
                "character_id": "C11",
                "outlook_id": "O14"
              }
            ],
            "source_facts": [
              "조타실, 핸들을 잡고 있는 황씨는 인우를 노려보는 시선에 적대감이 가득하다.",
              "인우는 선수에 서서 앞을 보려 애쓴다.",
              "바다 전체에 안개가 자욱해 앞이 잘 보이지 않는다."
            ],
            "visual_inferences": [
              "C11's grip on the steering wheel reflects his hostility, with tense shoulders and a sharp side profile.",
              "The interior of the wheelhouse remains subdued and neutral to contrast with the cold exterior fog.",
              "The window serves as a shared spatial anchor linking the foreground interior to the background bow."
            ],
            "creative_decisions": [
              "Applied a strict foreground/background spatial separation using the wheelhouse window to highlight the psychological distance between the characters.",
              "Incorporated the exact Frame Spatial Contract labels seamlessly into the opening framing description to anchor the composition."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "65c1d5d175abc904",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "124112f66b6e0b85",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 48,
        "dependency_reason": "Same wheelhouse interior background setting requires exact_background reference continuity.",
        "_shot_index": 3,
        "visible_entities": [
          "C11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 54,
            "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 inside the wheelhouse at shoulder height, hold a static medium side view close to 황봉업(황 씨), with his clenched hands on the wheel in the near left and his hostile profile occupying the middle third. Keep 정인우 small but legible on the bow along 황봉업(황 씨)'s outward sightline, preserving the visual axis that will cut forward toward the island.",
            "lighting_mood": "Daylight muted by the dense fog is shaped into restrained, high-contrast faces with a cold blue-black grade and subdued neutral surroundings.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "Jeong Inwoo on the bow",
                  "label": "황봉업(황 씨)",
                  "screen_zone": "middle_left",
                  "target_id": "C11",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C11",
                "outlook_id": "O14"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dense_marine_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A thick, gray marine fog heavily obscures the surrounding environment, significantly reducing visibility across the water. The seascape is immersed in muted daylight with a cold, blue-black color grade, creating an ominous and oppressive atmosphere.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "바다 전체에 안개가 자욱해 앞이 잘 보이지 않는다.",
                  "Daylight muted by the dense fog",
                  "Fog-muted daytime illumination"
                ],
                "visual_inferences": [
                  "The fog creates a uniform, low-contrast veil over the sea, masking the clear line of the horizon."
                ],
                "creative_decisions": [
                  "Applying a restrained blue-black and earthy-neutral color grade to emphasize the mysterious and gloomy mood of the approach."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 48,
                "shot_index": 10,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C11O14",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "6c6b7c38d5162079"
      },
      {
        "scene_index": 54,
        "heading": "55. 실외. 황 씨의 낚시 어선 - 낮",
        "beat_title": "안개 속 음산하게 드러나는 금월도",
        "representative_moment": "짙은 바다 안개 사이로 음울하고 기괴한 형상의 섬이 솟아오르듯 모습을 드러낸다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Static eye-level wide view with a cold blue-black and earthy-neutral color grade",
            "t2i_prompt": "Photorealistic cinematic still. The dark, gloomy island emerges in the upper-center background, its irregular landform appearing as separated dark masses through the thick, gray marine fog. A static eye-level wide view over the forward axis places the open sea across the lower frame, the water heavily obscured by the uniform, low-contrast mist that masks the clear line of the horizon. The ominously obstructed vista is immersed in fog-muted daytime illumination, keeping the landmass low in tonal value against a restrained blue-black and earthy-neutral atmosphere.",
            "outfit_assignments": [],
            "source_facts": [
              "바다 전체에 안개가 자욱해 앞이 잘 보이지 않는다.",
              "안개 속 금월도가 모습을 드러낸다: 미스테리 한 느낌을 물씬 풍기는 음울한 섬"
            ],
            "visual_inferences": [
              "fixed_element dense_marine_fog: thick gray fog, muted daylight, cold blue-black grade",
              "The island appears as separated masses rather than a clean scenic silhouette due to the dense obscuring fog",
              "The open sea occupies the lower frame to emphasize the boat's advancing view toward the island"
            ],
            "creative_decisions": [
              "Placed the island in the upper-center background to strictly fulfill frame_spatial_contract fsc_001",
              "Utilized a restrained blue-black color palette to amplify the ominous and oppressive atmosphere of the isolated community"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "510c01b8c72394b3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "1657d14c769c6860",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 54,
        "dependency_reason": "직전 샷(Shot 3)과 동일한 바다 환경과 짙은 안개 상태(dense_marine_fog) 연속성 유지",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 54,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Cut to a static eye-level wide view precisely on the boat's forward axis, placing the island across the upper middle of the frame while open sea remains below it. Let the island's irregular form emerge in separated masses through the fog rather than presenting it as a clean scenic silhouette, ending the sequence on an ominously obstructed vista.",
            "lighting_mood": "Fog-muted daytime illumination keeps the island low in tonal value against a restrained blue-black and earthy-neutral grade.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "금월도",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dense_marine_fog",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A thick, gray marine fog heavily obscures the surrounding environment, significantly reducing visibility across the water. The seascape is immersed in muted daylight with a cold, blue-black color grade, creating an ominous and oppressive atmosphere.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "바다 전체에 안개가 자욱해 앞이 잘 보이지 않는다.",
                  "Daylight muted by the dense fog",
                  "Fog-muted daytime illumination"
                ],
                "visual_inferences": [
                  "The fog creates a uniform, low-contrast veil over the sea, masking the clear line of the horizon."
                ],
                "creative_decisions": [
                  "Applying a restrained blue-black and earthy-neutral color grade to emphasize the mysterious and gloomy mood of the approach."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 54,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "150d6be341769dd6"
      },
      {
        "scene_index": 55,
        "heading": "실외. 금월도 선착장 - 낮",
        "beat_title": "적대적인 주민들의 시선에 위축된 인우",
        "representative_moment": "선착장에 발을 디딘 인우가 자신을 둘러싼 마을 주민들의 차갑고 적대적인 시선에 쭈뼛거린다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height over-the-shoulder wide shot, deep focus on the staggered villagers, natural ambient light",
            "t2i_prompt": "Photorealistic cinematic still. Shot from chest height just behind and slightly beside the subject, the shoulder and back of a young Korean man in a dark casual jacket occupying the near foreground edge, hesitating mid-stride with his back to the camera. Across the open shared space of the concrete pier, several middle-aged and elderly Korean villagers in weathered rural workwear stand clustered in staggered depth across the middle distance. They are seen at a three-quarter angle from the left, with shoulders set, their converging hostile gazes fixed on the man in the foreground. A weathered fishing boat sits moored at the dock behind the man's edge position, while a fishing net and a wooden crate rest on the pier nearby. Natural daytime ambient light bathes the scene in restrained earthy neutrals and blue-black shadows, keeping the villagers' cold expressions readable.",
            "outfit_assignments": [],
            "source_facts": [
              "S56 action: '배에서 선착장으로 훌쩍 점프해서 내려서는 인우.'",
              "S56 action: '인우를 향한 사람들 시선은 곱지가 않다.'",
              "S56 action: '그 시선에 쭈뼛해진 인우.'",
              "shot description: over_shoulder perspective of Jung In-woo looking at villagers"
            ],
            "visual_inferences": [
              "chest-height camera emphasizing In-woo's hesitated posture at the edge",
              "villagers arranged in staggered depth to convey a feeling of being surrounded"
            ],
            "creative_decisions": [
              "wide framing to capture the spatial tension between In-woo and the villagers on the pier",
              "restrained earthy neutrals and blue-black shadows to enhance the cold and hostile mood"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "barricade",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "anchor",
                "source_phrase": "fishing net and a wooden crate rest on the pier"
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "anchor",
                "source_phrase": "weathered fishing boat sits moored at the dock"
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "anchor",
                "source_phrase": "fishing net and a wooden crate rest on the pier"
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "garland",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "open shared space of the concrete pier"
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warning sign",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "eb7dbe3443a0e7f8",
              "owned_hash": "e792fcf5db191d8e",
              "camera_direction_hash": "f7ce4d7f0dce73f0",
              "owned_usage_hash": "154ef3a029f2029f",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "pier",
                  "violating_phrase": "concrete pier",
                  "reason": "The pier is mentioned as a spatial anchor for the characters and props, matching the producer's declaration of anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fishing boat",
                  "violating_phrase": "weathered fishing boat sits moored at the dock",
                  "reason": "The fishing boat is used as a background anchor element with no redraw commands, aligning with the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fishing net",
                  "violating_phrase": "fishing net",
                  "reason": "The fishing net is mentioned as resting on the pier as a background element, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "crate",
                  "violating_phrase": "wooden crate",
                  "reason": "The wooden crate is referenced as a passive prop resting on the pier, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "동일한 금월도 선착장 배경(L15B02)의 공간적 연속성 유지",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 55,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height just behind and slightly beside 정인우, pan across a slightly wide arrangement of several 금월도 마을 주민 while retaining his hesitant shoulder and torso at the near edge. Distribute the residents across the middle distance in staggered depth, allowing their converging hostile gazes—not a frontal lineup—to make 정인우 feel surrounded.",
            "lighting_mood": "Natural daytime ambient light is graded in restrained earthy neutrals and blue-black shadows, keeping the residents' eyes readable without introducing a specific source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L15B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "banner",
              "barricade",
              "bollard",
              "crate",
              "fishing boat",
              "fishing net",
              "flag",
              "gangway",
              "garland",
              "lamp",
              "pier",
              "railing",
              "rope",
              "shed",
              "tire",
              "warning sign"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L15B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "eadede68e2aa6bac"
      },
      {
        "scene_index": 55,
        "heading": "56. 실외. 금월도 선착장 - 낮",
        "beat_title": "선착장의 적대적인 시선과 영란의 주시",
        "representative_moment": "An older Asian woman with prominent pale hair stands still in front of the restaurant, gazing intently off-screen toward the dock.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium observer perspective with restrained daytime ambient light and earthy-neutral grading",
            "t2i_prompt": "Photorealistic cinematic still. Seen from an eye-level observer perspective at a medium distance, an older Asian woman in everyday rural clothing with prominent pale, white hair stands quietly just off-center in the foreground. She is turned at a three-quarter angle from the right, her weight fixed on her front foot, looking off-screen past the camera with a steady, intense gaze. [L15B02: The exterior frontage of a rural island restaurant fills the background, featuring an earthy, weathered facade that leaves an unobstructed sightline toward the unseen dock]. Restrained natural daytime ambient light bathes the scene, creating an aged ivory and earthy-neutral grading around the woman's pale hair to emphasize her stillness against the environment.",
            "outfit_assignments": [],
            "source_facts": [
              "반월 식당 앞에 나온 영란이 마을 쪽으로 들어오는 인우를 지켜본다.",
              "강영란(흰 머리 여자), weight fixed on front foot, pale hair",
              "restaurant frontage, natural daytime ambient light"
            ],
            "visual_inferences": [
              "fixed_element yeongran_standing_posture: She wears everyday rural clothing suitable for a remote coastal village setting.",
              "fixed_element banwol_restaurant_exterior: A weathered architectural style typical of an island village."
            ],
            "creative_decisions": [
              "Placed the woman off-center at a medium distance to maintain the clear sightline between the restaurant and the dock area.",
              "Applied restrained contrast and aged ivory grading to highlight her pale hair and anchor her visually against the earthy background."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "barricade",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "garland",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warning sign",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "367c3c470dbfee32",
              "owned_hash": "e792fcf5db191d8e",
              "camera_direction_hash": "939a66d2898e6d55",
              "owned_usage_hash": "b8c465408462a442",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "exact_background ref_usage required to maintain the consistent exterior of the Banwol restaurant established in Scene 20 Shot 8.",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 55,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "On the eye-level line from the dock toward the restaurant, ease the dolly-in almost to a stop at a medium distance so 강영란(흰 머리 여자)'s stillness becomes the sole changed emphasis. Place her just off center before the restaurant, turned slightly three-quarter rather than square to the lens, with her fixed gaze traveling past the camera toward 정인우 on the dock side.",
            "lighting_mood": "Natural daytime ambient light is held in restrained contrast, with aged ivory and earthy-neutral grading around 강영란(흰 머리 여자)'s pale hair.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L15B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "banner",
              "barricade",
              "bollard",
              "crate",
              "fishing boat",
              "fishing net",
              "flag",
              "gangway",
              "garland",
              "lamp",
              "pier",
              "railing",
              "rope",
              "shed",
              "tire",
              "warning sign"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "yeongran_standing_posture",
                "element_type": "character_state",
                "character_name": "Kang Yeong-ran",
                "description": "An older woman with prominent pale, white hair stands quietly in front of the restaurant. Her posture is mostly still with her weight fixed on her front foot, keeping a steady gaze directed off-screen toward the dock area.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "반월 식당 앞에 나온 영란이 마을 쪽으로 들어오는 인우를 지켜본다.",
                  "강영란(흰 머리 여자)",
                  "weight fixed on front foot",
                  "pale hair"
                ],
                "visual_inferences": [
                  "She wears everyday rural clothing suitable for a remote coastal village setting."
                ],
                "creative_decisions": [
                  "Kept as a still, grounding visual anchor in the foreground to contrast with the active waving motion happening behind her in the wider frame."
                ],
                "confidence": "high"
              },
              {
                "element_id": "banwol_restaurant_exterior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior frontage of a rural island restaurant serves as the background setting. The building features an earthy, weathered facade bathed in restrained natural daytime ambient light.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "반월 식당 앞",
                  "restaurant frontage",
                  "restaurant background"
                ],
                "visual_inferences": [
                  "A weathered architectural style typical of an island village, possibly with a simple signboard identifying it."
                ],
                "creative_decisions": [
                  "Rendered with restrained contrast and an earthy-neutral grading to keep the visual focus on the characters standing in front of it."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L15B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "1e5db0432a555c81"
      },
      {
        "scene_index": 55,
        "heading": "실외. 금월도 선착장 - 낮",
        "beat_title": "수리영의 반가운 인사",
        "representative_moment": "영란의 등 뒤 식당에서 나온 수리영이 인우를 향해 반갑게 손을 흔든다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye level medium framing with foreground-background separation and selective contrast",
            "t2i_prompt": "Photorealistic cinematic still. At eye level in medium framing, two figures share the space in front of the earthy, weathered restaurant facade. In the soft near-foreground, an older Korean woman with prominent pale white hair in everyday rural clothing stands at a three-quarter angle from the left, shoulder turning toward the dock, gazing off-screen. Cleared behind her in the opposite middle third, a young Korean woman stands at a three-quarter angle from the right, her one arm raised high waving, eyes fixed off-screen. Natural daytime ambient light bathes the scene in a restrained neutral palette, providing selective contrast that separates the young woman's raised hand from the restaurant background.",
            "outfit_assignments": [],
            "source_facts": [
              "영란이 마을 쪽으로 들어오는 인우를 지켜본다.",
              "식당 앞 영란",
              "영란 뒤, 식당에서 나온 수리영이 인우를 향해 손을 흔든다."
            ],
            "visual_inferences": [
              "fixed_element yeongran_standing_posture: older woman with prominent pale white hair in everyday rural clothing",
              "fixed_element banwol_restaurant_exterior: earthy, weathered facade",
              "Medium framing with depth separation between the near-foreground woman and the midground waving woman"
            ],
            "creative_decisions": [
              "Soft focus on the foreground figure to draw attention to the midground action",
              "Restrained neutral daytime lighting to create contrast around the raised waving hand against the building"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "barricade",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "garland",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warning sign",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7413900e56d8f72c",
              "owned_hash": "e792fcf5db191d8e",
              "camera_direction_hash": "e1a59b7db2cabf5f",
              "owned_usage_hash": "b8c465408462a442",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 55,
        "dependency_reason": "Shares the same exact background setting as the prior shot, focusing on the restaurant frontage",
        "_shot_index": 7,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 55,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level facing the restaurant, finish the lateral track with 강영란(흰 머리 여자) as a soft near-foreground reference on one side and 김지후(강수리영) newly cleared behind her in the opposite middle third. Keep 김지후(강수리영)'s lifted arm separated against the restaurant frontage while her welcoming wave and gaze travel toward 정인우 off screen.",
            "lighting_mood": "Natural daytime ambient light preserves a restrained neutral palette while selective contrast separates the raised hand from the restaurant background.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L15B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "banner",
              "barricade",
              "bollard",
              "crate",
              "fishing boat",
              "fishing net",
              "flag",
              "gangway",
              "garland",
              "lamp",
              "pier",
              "railing",
              "rope",
              "shed",
              "tire",
              "warning sign"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "yeongran_standing_posture",
                "element_type": "character_state",
                "character_name": "Kang Yeong-ran",
                "description": "An older woman with prominent pale, white hair stands quietly in front of the restaurant. Her posture is mostly still with her weight fixed on her front foot, keeping a steady gaze directed off-screen toward the dock area.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "반월 식당 앞에 나온 영란이 마을 쪽으로 들어오는 인우를 지켜본다.",
                  "강영란(흰 머리 여자)",
                  "weight fixed on front foot",
                  "pale hair"
                ],
                "visual_inferences": [
                  "She wears everyday rural clothing suitable for a remote coastal village setting."
                ],
                "creative_decisions": [
                  "Kept as a still, grounding visual anchor in the foreground to contrast with the active waving motion happening behind her in the wider frame."
                ],
                "confidence": "high"
              },
              {
                "element_id": "banwol_restaurant_exterior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior frontage of a rural island restaurant serves as the background setting. The building features an earthy, weathered facade bathed in restrained natural daytime ambient light.",
                "applies_to_shots": [
                  5,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "반월 식당 앞",
                  "restaurant frontage",
                  "restaurant background"
                ],
                "visual_inferences": [
                  "A weathered architectural style typical of an island village, possibly with a simple signboard identifying it."
                ],
                "creative_decisions": [
                  "Rendered with restrained contrast and an earthy-neutral grading to keep the visual focus on the characters standing in front of it."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 55,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L15B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "9e9b5a22cfd3c902"
      },
      {
        "scene_index": 56,
        "heading": "실외. 금월도 해안길 - 낮",
        "beat_title": "불신에 찬 정인우의 멈춤",
        "representative_moment": "정인우(C03)가 비좁은 해안길에서 어이없다는 듯 걸음을 멈추고 앞선 수리영을 쏘아본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium composition, restrained blue-black grade with firm facial contrast",
            "t2i_prompt": "Photorealistic cinematic still. An eye-level medium framing on a shared narrow coastal path. C03O04 in dark fishing workwear, an Asian young man in his mid-20s with short black hair and a clean-cut face, occupies the right side of the frame, torso and head visible. He is halted with his weight pulled back at three-quarter angle from the left, his disbelieving eyes fixed on the other figure. At the opposite left frame edge, the shoulder and partial back-of-head profile of an Asian young woman occupies the foreground, her head turning mid-step toward him, establishing the shared physical space without forming a symmetrical two-shot. The rocky dirt path is bordered by jagged stones and the sea beyond. Natural daytime ambient light casts firm facial contrast on the young man, wrapped in a restrained blue-black and earthy-neutral color grade that carries a cool, gloomy daytime atmosphere.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "S56 action: 정인우(C03) stops on the narrow path and expresses disbelief.",
              "shot description: medium three-quarter view of 정인우 halting, looking at the other figure's shoulder/profile at the edge."
            ],
            "visual_inferences": [
              "S39_Shot7 atmosphere_reference: cool, gloomy daytime mood applied to the new coastal path setting.",
              "Eye-level medium framing keeps torsos in frame, implying lower bodies out of frame."
            ],
            "creative_decisions": [
              "Placed the secondary figure (unregistered as C01 in this shot's valid IDs) at the left frame edge using a generic demographic descriptor to act as a foreground spatial anchor on the shared coastal path."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "2fe36cf66513ff65",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "5bc50bc6fadc1515",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 39,
        "dependency_reason": "S39_Shot7 분위기(atmosphere_reference) 적용: 톤과 무드 연속성 유지",
        "_shot_index": 3,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 56,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Hold static at eye level in front of 정인우 and slightly toward 김지후(강수리영)'s side of the narrow path, framing 정인우 in a medium three-quarter view as his forward movement stops. Keep 김지후(강수리영)'s shoulder and partial profile at the opposite edge so his disbelieving stare has an explicit destination without turning the moment into a symmetrical two-shot.",
            "lighting_mood": "Natural daytime ambient light is rendered with firm facial contrast and a restrained blue-black and earthy-neutral grade.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 39,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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": [],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "0f9f7591090c6c3b"
      },
      {
        "scene_index": 56,
        "heading": "57. 실외. 금월도 해안길 - 낮",
        "beat_title": "Ascending the Dangerous Rock Face",
        "representative_moment": "C01 and C03 carefully climb up a steep, jagged coastal rock face, clinging tightly to the uneven surface.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Lateral low-angle wide shot from below chest height, high-contrast natural lighting",
            "t2i_prompt": "Photorealistic cinematic still. In the middle-right midground, C01O01 in a casual outfit, a Korean woman in her 20s, moves toward higher rock holds, and in the lower-left midground, C03O04 in fishing wear, a Korean man in his 20s, moves toward higher rock holds, both sharing the steep coastal rock face below the upper route toward the forest in the upper-center background. Captured from a lateral low-angle wide viewpoint below chest height, C01O01 is seen in right profile, her body pressed closely against the jagged rock surface with one foot raised as she looks up. C03O04 is in left profile, bracing himself against the rough stone with his center of gravity kept low, reaching upward to secure a firm grip while looking up. Natural daytime ambient light defines the rugged rock contours, maintaining a restrained, high-contrast neutral grade across the uneven stone.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "가까스로 바위를 붙잡고 숲쪽으로 올라가는 수리영과 인우.",
              "가파른 해안가 바위벽에 찰싹 달라붙어 조심스럽게 위쪽 바위를 향해 한쪽 발을 뻗은 김지후(강수리영)와 정인우의 모습."
            ],
            "visual_inferences": [
              "fixed_element: C01's body is pressed closely against the jagged rock surface.",
              "fixed_element: C03 keeps his center of gravity low, bracing against the stone.",
              "fixed_element: The rock formation is highly steep and jagged, requiring precarious footing."
            ],
            "creative_decisions": [
              "Applied a lateral low-angle wide composition to fit both characters head-to-foot along the steep incline without distorting their poses.",
              "Used a high-contrast neutral grade for the natural daytime light to emphasize the harshness and danger of the rocky environment."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002",
              "fsc_003"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ca49d8a263a3b3f0",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "0cab069906174ed1",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 56,
        "dependency_reason": "Maintains the continuous coastal environment setting indicated by the previous_shot_refs location link.",
        "_shot_index": 6,
        "visible_entities": [
          "C01",
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 56,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track laterally from below chest height in a low-angle wide view, keeping both climbers visible head to foot against the steep rock section. Place 김지후(강수리영) slightly higher on one side and 정인우 lower on the other, each pressed close to the rocks at the instant one foot searches upward while their hands maintain contact.",
            "lighting_mood": "Natural daytime ambient light keeps the rock contours and body separation legible within a restrained, high-contrast neutral grade.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "upper route toward the forest",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "higher rock holds",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_right",
                  "target_id": "C01",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_003",
                  "depth_plane": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "higher rock holds",
                  "label": "정인우",
                  "screen_zone": "lower_left",
                  "target_id": "C03",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "kim_jihoo_climbing_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A man clinging tightly to a steep coastal rock face, gazing upward. His body is pressed closely against the jagged rock surface to maintain balance as he carefully searches for a foothold.",
                "applies_to_shots": [
                  6,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "가까스로 바위를 붙잡고 숲쪽으로 올라가는 수리영",
                  "hugging rock one foot raised",
                  "clinging high on rocks"
                ],
                "visual_inferences": [
                  "His limbs are spread and stretched out to find stable grips on the uneven stone surface."
                ],
                "creative_decisions": [
                  "Emphasizing a precarious, full-body clinging posture to highlight the dangerous vertical drop below."
                ],
                "confidence": "high"
              },
              {
                "element_id": "jung_inwoo_climbing_posture",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A man bracing himself against the steep coastal rocks, reaching upward with his hands to secure a firm grip. He keeps his center of gravity low, staying pressed against the rough stone while ascending.",
                "applies_to_shots": [
                  6,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "가까스로 바위를 붙잡고 숲쪽으로 올라가는 인우",
                  "bracing rock reaching upward",
                  "pulling toward upper hold"
                ],
                "visual_inferences": [
                  "He holds firmly to the rock outcroppings, visually expressing the physical effort of the climb."
                ],
                "creative_decisions": [
                  "Showing tension in his back and shoulders to convey the steepness and difficulty of the terrain."
                ],
                "confidence": "high"
              },
              {
                "element_id": "steep_coastal_rock_face",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A highly steep, jagged coastal rock formation rising upward from the sea toward a forested edge. The rugged, uneven stone surface provides only precarious handholds and footholds.",
                "applies_to_shots": [
                  6,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "가파른 바위들이 이어진다",
                  "자칫 발을 헛디디면 바닷물에 빠지거나, 바위에 떨어져 크게 다칠만 한 상황",
                  "steep rock section"
                ],
                "visual_inferences": [
                  "The rock texture is dark and heavily weathered by the sea, offering limited safe climbing paths."
                ],
                "creative_decisions": [
                  "Enhancing the sharpness of the rock edges to heighten the sense of environmental threat."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 56,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_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": "ef79bd7ab71cf4c2"
      },
      {
        "scene_index": 56,
        "heading": "실외. 금월도 해안길 - 낮",
        "beat_title": "가파른 해안 절벽을 오르는 두 사람과 이를 감시하는 황 씨",
        "representative_moment": "황 씨(C11)가 배 위에서 해안 절벽을 기어오르는 두 사람을 멀리서 지켜보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide side view from shoulder height on the boat, natural daytime ambient light with stark tonal separation",
            "t2i_prompt": "Photorealistic cinematic still. C11O14 in dark fisher workwear, a Korean middle-aged man, stands in the middle-left foreground in right profile, leaning forward on the boat deck, looking toward two climbers on the distant coast in the background. A wide distance of water stretches between the boat and the distant coast, sharing a single line of sight from the camera. The boat's outer side runs beneath C11O14 and points toward the distant coast. In the distant background, a highly steep, jagged coastal rock formation rising upward from the sea toward a forested edge; the rugged, uneven stone surface provides only precarious handholds and footholds. On this rock face, one man clinging tightly in left profile, gazing upward, his body pressed closely against the jagged rock surface to maintain balance as he carefully searches for a foothold. Below him, another man at a three-quarter angle from the right, bracing himself against the steep coastal rocks, gazing upward, reaching upward with his hands to secure a firm grip, keeping his center of gravity low, staying pressed against the rough stone while ascending. Natural daytime ambient light holds stark tonal separation, keeping C11O14 dark against the distant coastline without assigning a new light source.",
            "outfit_assignments": [
              {
                "character_id": "C11",
                "outlook_id": "O14"
              }
            ],
            "source_facts": [
              "멀리 배에서 이들을 감시하듯 지켜보는 황 씨.",
              "자칫 발을 헛디디면 바닷물에 빠지거나, 바위에 떨어져 크게 다칠만 한 상황.",
              "가까스로 바위를 붙잡고 숲쪽으로 올라가는 수리영과 인우."
            ],
            "visual_inferences": [
              "fixed_element kim_jihoo_climbing_posture: A man clinging tightly to a steep coastal rock face, gazing upward. His body is pressed closely against the jagged rock surface to maintain balance as he carefully searches for a foothold.",
              "fixed_element jung_inwoo_climbing_posture: A man bracing himself against the steep coastal rocks, reaching upward with his hands to secure a firm grip. He keeps his center of gravity low, staying pressed against the rough stone while ascending.",
              "fixed_element steep_coastal_rock_face: A highly steep, jagged coastal rock formation rising upward from the sea toward a forested edge. The rugged, uneven stone surface provides only precarious handholds and footholds."
            ],
            "creative_decisions": [
              "Framed from the boat looking toward the coast to establish the spatial gap and tension between the observer (foreground) and the climbers (background).",
              "Utilized stark tonal separation to render the observer in shadow, emphasizing his threatening surveillance."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c7cafecf107ea9ed",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b1a7017e7338e774",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 39,
        "dependency_reason": "같은 금월도 해안가의 가파른 바위 지형 배경과 분위기 연속성 유지 필요.",
        "_shot_index": 7,
        "visible_entities": [
          "C11"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 56,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From shoulder height on the boat beside 황봉업(황 씨), hold a static wide side view perpendicular to his gaze, placing his tense profile in the near third and the distant coast across the opposite background. Keep 김지후(강수리영) and 정인우 as small but separate climbing figures within that sightline, turning the previous ascent into an observed and threatening tableau.",
            "lighting_mood": "Natural daytime ambient light is held in stark tonal separation, keeping 황봉업(황 씨) dark against the more distant coastline without assigning a new light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "two climbers on the distant coast",
                  "label": "황봉업(황 씨)",
                  "screen_zone": "middle_left",
                  "target_id": "C11",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C11",
                "outlook_id": "O14"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "kim_jihoo_climbing_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A man clinging tightly to a steep coastal rock face, gazing upward. His body is pressed closely against the jagged rock surface to maintain balance as he carefully searches for a foothold.",
                "applies_to_shots": [
                  6,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "가까스로 바위를 붙잡고 숲쪽으로 올라가는 수리영",
                  "hugging rock one foot raised",
                  "clinging high on rocks"
                ],
                "visual_inferences": [
                  "His limbs are spread and stretched out to find stable grips on the uneven stone surface."
                ],
                "creative_decisions": [
                  "Emphasizing a precarious, full-body clinging posture to highlight the dangerous vertical drop below."
                ],
                "confidence": "high"
              },
              {
                "element_id": "jung_inwoo_climbing_posture",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "A man bracing himself against the steep coastal rocks, reaching upward with his hands to secure a firm grip. He keeps his center of gravity low, staying pressed against the rough stone while ascending.",
                "applies_to_shots": [
                  6,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "가까스로 바위를 붙잡고 숲쪽으로 올라가는 인우",
                  "bracing rock reaching upward",
                  "pulling toward upper hold"
                ],
                "visual_inferences": [
                  "He holds firmly to the rock outcroppings, visually expressing the physical effort of the climb."
                ],
                "creative_decisions": [
                  "Showing tension in his back and shoulders to convey the steepness and difficulty of the terrain."
                ],
                "confidence": "high"
              },
              {
                "element_id": "steep_coastal_rock_face",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A highly steep, jagged coastal rock formation rising upward from the sea toward a forested edge. The rugged, uneven stone surface provides only precarious handholds and footholds.",
                "applies_to_shots": [
                  6,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "가파른 바위들이 이어진다",
                  "자칫 발을 헛디디면 바닷물에 빠지거나, 바위에 떨어져 크게 다칠만 한 상황",
                  "steep rock section"
                ],
                "visual_inferences": [
                  "The rock texture is dark and heavily weathered by the sea, offering limited safe climbing paths."
                ],
                "creative_decisions": [
                  "Enhancing the sharpness of the rock edges to heighten the sense of environmental threat."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 39,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C11O14",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "da21e06debb7a305"
      },
      {
        "scene_index": 57,
        "heading": "실외. 숲속 - 낮",
        "beat_title": "발견된 비석의 이름",
        "representative_moment": "A tight close-up of the old stone marker's weathered face, faintly bearing the characters '수 리 영' within the dense forest.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "subjective POV close-up, shallow depth of field, restrained contrast",
            "t2i_prompt": "Photorealistic cinematic still. The inscribed face of the marker occupies the middle-center foreground. The weathered stone surface is viewed perpendicular to the camera from a direct eye line, centering the faintly separated characters '수 리 영' within roughly the middle third of the frame rather than allowing the stone to consume the entire view. Portions of the marker's rough edges are visible, surrounded by the soft, out-of-focus context of the daytime forest environment at the frame edges. Wild brush and dark foliage blur into the background. Natural daytime ambient daylight reveals the faint inscription with restrained contrast and a subdued earthy-neutral color grading, creating a mysterious, low-key atmosphere.",
            "outfit_assignments": [],
            "source_facts": [
              "S57 action: '수리영' 글자가 흐릿하게 적혀있는 비석.",
              "shot description: A close-up of the marker's inscribed face from Jung In-woo's direct eye line."
            ],
            "visual_inferences": [
              "fixed_element daytime_forest_environment: Natural daytime ambient light, subdued earthy-neutral grading, wild brush, dark foliage, and rough terrain.",
              "The subjective POV focuses intensely on the text, blurring the surrounding forest into a soft background."
            ],
            "creative_decisions": [
              "Utilized a shallow depth of field to isolate the inscribed front face while keeping the edges and surrounding forest visible, ensuring the marker reads as a discovered physical clue rather than a flat title card."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f9ef6d4799f44016",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "4774459b9bbf3d82",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 57,
            "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 정인우's direct eye line, hold very close and perpendicular to the marker's inscribed face, centering the faintly separated characters “수 리 영” within roughly the middle third rather than allowing the object to consume the frame. Preserve portions of the marker's edges and soft forest context around it so the inscription reads as a discovered physical clue, not a graphic title card.",
            "lighting_mood": "Natural daytime ambient light appropriate to the forest reveals the faint inscription with restrained contrast and subdued earthy-neutral grading.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "inscribed face of the marker",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense forest environment during the daytime. The area is illuminated by natural ambient daylight with a subdued, earthy-neutral color grading, featuring wild brush, dark foliage, and rough terrain that create a mysterious, low-key atmosphere.",
                "applies_to_shots": [
                  2,
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲속 - 낮",
                  "Natural daytime ambient light appropriate to the forest",
                  "subdued earthy-neutral grading"
                ],
                "visual_inferences": [
                  "The dense vegetation and overgrown brush cast deep shadows, enhancing the secluded feel of the environment."
                ],
                "creative_decisions": [
                  "Maintaining a consistent earthy and restrained visual palette across all angles to emphasize the eerie isolation of the location."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "5ac2e2f569314b17"
      },
      {
        "scene_index": 57,
        "heading": "실외. 숲속 - 낮",
        "beat_title": "기이한 비석과 수리영의 경고",
        "representative_moment": "비석을 살피는 인우의 등 뒤로, 미간을 잔뜩 찌푸린 채 긴장한 얼굴로 서 있는 C01.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight over-the-shoulder composition from eye level with shallow depth of field.",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level camera, close framing. An Asian man with his back to the camera wipes sweat from his forehead, his blurred back and shoulder confined to the left foreground edge. Sharing the immediate space near the stone marker, C01O01 in a dark jacket, a pale young Korean woman with long black hair, occupies most of the middle frame. She leans forward at a three-quarter angle from the left, her face locked in a highly tense and serious expression, brows deeply knitted into a heavy frown, her sharp vigilant eyes looking off-screen. [: An oblique portion of an old stone marker's front face anchors the lower frame edge, its faint writing completely out of focus]. Out-of-focus dark foliage provides subdued depth behind her. Natural daytime forest ambient light shapes low-key facial contrast, graded with earthy neutral tones and deep blue-black shadows.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "인우가 이마에 땀을 닦으며 비석을 살펴본다.",
              "뒤에서 인상을 팍 쓰고 있는 수리영.",
              "바짝 긴장한 얼굴로 날카롭게 눈을 빛내며",
              "Natural daytime ambient light appropriate to the forest"
            ],
            "visual_inferences": [
              "fixed_element suriyoung_tense_face: brows deeply knitted into a heavy frown, sharp vigilant gaze",
              "fixed_element daytime_forest_environment: earthy-neutral color grading, dark foliage, low-key atmosphere",
              "Over-the-back close framing isolates the subject's tense reaction from the background environment"
            ],
            "creative_decisions": [
              "Confined the unregistered figure (Inwoo) strictly to the left foreground edge to act as a spatial anchor without distracting from C01's face.",
              "Used a shallow depth of field (skipped background reference) to emphasize C01's heavy frown.",
              "Introduced deep blue-black shadow grading to contrast the natural daylight and enhance the mysterious mood."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "2dc2541f2b90a062",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "dbbf0ed60992c743",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 57,
        "dependency_reason": "동일한 숲속 공간에서의 연속된 상황이므로 조명, 색감, 비석의 외형적 톤 연속성 유지",
        "_shot_index": 3,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 57,
            "shot_index": 3
          },
          "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 near the marker, complete the dolly-out into a tight over-the-back composition with 정인우's blurred back confined to one foreground edge and 김지후(강수리영)'s frowning face occupying most of the middle frame. Hold the same marker-facing axis and prepare the next downward tilt by leaving the lower edge visually open toward the marker's base.",
            "lighting_mood": "Natural daytime forest ambience is shaped into low-key facial contrast, with restrained earthy neutrals and blue-black shadow grading.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense forest environment during the daytime. The area is illuminated by natural ambient daylight with a subdued, earthy-neutral color grading, featuring wild brush, dark foliage, and rough terrain that create a mysterious, low-key atmosphere.",
                "applies_to_shots": [
                  2,
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲속 - 낮",
                  "Natural daytime ambient light appropriate to the forest",
                  "subdued earthy-neutral grading"
                ],
                "visual_inferences": [
                  "The dense vegetation and overgrown brush cast deep shadows, enhancing the secluded feel of the environment."
                ],
                "creative_decisions": [
                  "Maintaining a consistent earthy and restrained visual palette across all angles to emphasize the eerie isolation of the location."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suriyoung_tense_face",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "The young woman's face is locked in a highly tense and serious expression. Her brows are deeply knitted into a heavy frown, and her eyes maintain a sharp, vigilant gaze as she reacts to the dangerous surroundings.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "close",
                "source_facts": [
                  "인상을 팍 쓰고 있는 수리영",
                  "frowning face occupying most of the middle frame",
                  "brow knotted",
                  "바짝 긴장한 얼굴로 날카롭게 눈을 빛내며"
                ],
                "visual_inferences": [
                  "Her facial tension and sharp gaze remain identical whether she is standing still behind her companion or moving aggressively through the brush."
                ],
                "creative_decisions": [
                  "Focusing on her knotted brows and sharp eyes as a localized detail to clearly communicate her heightened awareness of peril."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 57,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "41958a1dc195c01e"
      },
      {
        "scene_index": 57,
        "heading": "실외. 숲속 - 낮",
        "beat_title": "위험을 경고하며 숲을 뚫고 나아가는 수리영",
        "representative_moment": "바짝 긴장한 표정으로 어두운 수풀을 팔로 밀어내며 숲길을 헤쳐 나가는 수리영(C01)의 모습",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "waist-height wide framing tracking backward with earthy-neutral natural daylight",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a Korean woman in her early 20s, appears in the middle-center midground, moving toward the foreground path. Seen from a waist-height perspective ahead of her that captures a widened full-body frame, her shoes and lower legs occupy the lower frame edge while her head extends toward the upper frame. She is angled at three-quarter left, frozen mid-stride on the rough terrain with one foot planted firmly and the other driving forward. Her extended arm reaches across the upper-left, forcefully pushing aside the dark brush, her long straight black hair flowing slightly back in the direction opposite to her forward motion. Her young pale face is locked in a highly tense and serious expression, brows deeply knitted into a heavy frown, maintaining a sharp, vigilant gaze looking off-screen. A dense daytime forest environment surrounds her, illuminated by natural ambient daylight with a subdued, earthy-neutral color grading and restrained contrast. The wild brush and dark foliage cast deep shadows, the dense undergrowth visibly parting around her movement along the route ahead.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "Shot 5: 바짝 긴장한 얼굴로 날카롭게 눈을 빛내며 어두운 수풀을 팔로 밀어내고 한 발을 앞으로 뻗어 내딛은 미드액션 자세",
              "Camera direction: waist height ahead of the character, track backward, widened full-body frame",
              "Character angle: three_quarter_left, gaze=off_screen",
              "Lighting mood: Natural daylight appropriate to the forest is rendered with restrained contrast and subdued earthy color"
            ],
            "visual_inferences": [
              "fixed_element daytime_forest_environment: dense forest, rough terrain, dark foliage casting deep shadows",
              "fixed_element suriyoung_tense_face: highly tense and serious expression, brows deeply knitted into a heavy frown",
              "Mid-action freeze principle applied: hair flows opposite to the direction of motion to preserve kinetic energy in a still frame"
            ],
            "creative_decisions": [
              "Incorporated the frame spatial contract (fsc_001) in the opening sentence exactly as specified",
              "Aligned the waist-height perspective geometrically by anchoring the feet at the lower frame edge and the upper body stretching toward the upper edge",
              "Used earthy-neutral tones and natural shadows to reinforce the secluded and mysterious atmosphere"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "df4ea39fa6e8ac0e",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "127ef844ef244109",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 5,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 57,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From waist height ahead of 김지후(강수리영), track backward along her path while holding a widened full-body frame. Keep her on the center-right with the extended arm reaching across the upper-left brush, one foot planted and the other driving forward, so the foliage parts around her movement without cropping the gesture.",
            "lighting_mood": "Natural daylight appropriate to the forest is rendered with restrained contrast and subdued earthy color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "foreground path",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dense forest environment during the daytime. The area is illuminated by natural ambient daylight with a subdued, earthy-neutral color grading, featuring wild brush, dark foliage, and rough terrain that create a mysterious, low-key atmosphere.",
                "applies_to_shots": [
                  2,
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲속 - 낮",
                  "Natural daytime ambient light appropriate to the forest",
                  "subdued earthy-neutral grading"
                ],
                "visual_inferences": [
                  "The dense vegetation and overgrown brush cast deep shadows, enhancing the secluded feel of the environment."
                ],
                "creative_decisions": [
                  "Maintaining a consistent earthy and restrained visual palette across all angles to emphasize the eerie isolation of the location."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suriyoung_tense_face",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "The young woman's face is locked in a highly tense and serious expression. Her brows are deeply knitted into a heavy frown, and her eyes maintain a sharp, vigilant gaze as she reacts to the dangerous surroundings.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "close",
                "source_facts": [
                  "인상을 팍 쓰고 있는 수리영",
                  "frowning face occupying most of the middle frame",
                  "brow knotted",
                  "바짝 긴장한 얼굴로 날카롭게 눈을 빛내며"
                ],
                "visual_inferences": [
                  "Her facial tension and sharp gaze remain identical whether she is standing still behind her companion or moving aggressively through the brush."
                ],
                "creative_decisions": [
                  "Focusing on her knotted brows and sharp eyes as a localized detail to clearly communicate her heightened awareness of peril."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 57,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "13d14b11eaf9185e"
      },
      {
        "scene_index": 58,
        "heading": "실외. 염소 축사 - 낮",
        "beat_title": "적막한 텅 빈 축사 전경",
        "representative_moment": "염소 떼가 사라진 낡고 어두운 축사의 내부를 깊게 비추는 정적의 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "standing eye-level wide view, central perspective, low-contrast natural daytime ambient",
            "t2i_prompt": "Photorealistic cinematic still. Standing eye-level wide view lengthwise through the empty interior of an old goat barn. The central passage recedes straight through the frame, completely desolate and devoid of any animals or figures. Aged wooden structures and fencing line both sides, receding into deep shadows. Subdued, low-contrast natural daytime ambient light falls into the dark space, softly illuminating the textured ground. At the far end of the composition, the barn entrance is visible, forming a distant endpoint to the deep axis. The camera focuses on the uninterrupted depth and the eerie, tension-filled emptiness of the long corridor.",
            "outfit_assignments": [],
            "source_facts": [
              "텅 빈 축사",
              "검은 염소만 없을 뿐",
              "낡고 어두운 축사의 적막한 내부 전경",
              "The interior of the old goat barn is completely empty, devoid of any goats or animals.",
              "The central passage recedes through the frame with no figures or goats interrupting the depth"
            ],
            "visual_inferences": [
              "Aged wooden structures and fencing lining the passage",
              "Textured ground illuminated softly by ambient light",
              "Central perspective focusing on the distant entrance"
            ],
            "creative_decisions": [
              "Used a symmetrical wide central perspective to emphasize the deep, uninterrupted emptiness and psychological tension",
              "Applied low-key, low-contrast daytime lighting to preserve the dark, gloomy atmosphere of the barn interior"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8e0857883a255183",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b92929b88471268d",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 47,
        "dependency_reason": "동일한 장소(축사)의 이전 씬 배경 분위기 연속성 유지",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 58,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At standing eye level several meters inside the barn, hold a static wide view lengthwise through the empty interior. The central passage recedes through the frame with no figures or goats interrupting the depth, creating a still entry composition before the camera begins its backward transition.",
            "lighting_mood": "Natural daytime ambience appropriate to the setting falls into a dark, low-contrast barn interior.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "empty_goat_barn_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the old goat barn is completely empty, devoid of any goats or animals. The space is desolate and dark, illuminated only by subdued, low-contrast natural daytime ambient light that preserves deep shadows within the structure.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "텅 빈 축사",
                  "검은 염소만 없을 뿐",
                  "낡고 어두운 축사의 적막한 내부 전경",
                  "dark, low-contrast barn interior",
                  "a narrow trace of the barn remains at one edge",
                  "preserves the barn's darkness"
                ],
                "visual_inferences": [
                  "The barn consists of aged wooden or metal structures that contribute to the dark and gloomy atmosphere.",
                  "The background remains consistently out of focus or faintly visible behind the character in closer shots."
                ],
                "creative_decisions": [
                  "Maintain the exact low-key lighting and eerie emptiness across all views to emphasize the psychological tension of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 47,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "4da0f43099461037"
      },
      {
        "scene_index": 58,
        "heading": "실외. 염소 축사 - 낮",
        "beat_title": "기억의 실체를 확인하고 엄습하는 극도의 공포",
        "representative_moment": "가쁜 숨을 들이마신 채 극도의 긴장으로 굳어 있는 C01의 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level extreme close-up dolly, subdued low-contrast daylight",
            "t2i_prompt": "Photorealistic cinematic still. C01O01, a Korean early 20s woman in casual clothes, occupies the middle-center foreground. Captured in an eye-level extreme close-up directly ahead of the figure, her face is turned at a three-quarter angle from the right. Her shoulders are locked mid-inhale, and her rigid eyes are looking off-screen. Physical tension registers clearly in her tightened jaw and flared nostrils, her face and neck dominating the frame. Subdued, low-contrast natural daytime ambient light sharply defines her strained expression against [: a narrow, defocused trace of the dark, desolate wooden barn interior preserving deep shadows at the frame edge].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S59 text: 수리영은 꿈이 아니었음을 확인하고 긴장으로 쉴 새 없이 가슴이 도리질 친다",
              "shot description: extreme close-up of her rigid eyes and arrested inhalation",
              "barn interior: empty and dark, retained only as a narrow trace"
            ],
            "visual_inferences": [
              "fixed_element empty_goat_barn_interior: desolate and dark space illuminated by low-contrast natural daytime ambient light",
              "defocused background strip isolates the character's psychological tension",
              "tightened jaw and flared nostrils visually anchor the abstract feeling of 'extreme tension' and 'arrested inhalation'"
            ],
            "creative_decisions": [
              "use an eye-level extreme close-up to physically crowd the frame with her face, maximizing claustrophobic tension",
              "limit background visibility to a single edge trace to obey skipped_close_framing while hinting at the dark barn environment",
              "apply low-key lighting to sharply define facial contours despite daylight"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b8f657c40ed568e2",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9e2654b34c2e7e44",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 46,
        "dependency_reason": "과거 숲/축사 근처에서 벌어졌던 사건의 물리적 배경(축사 내부)으로 공간의 연속성을 유지하되, 현재는 텅 빈 상태를 강조 (단, close-up shot이므로 배경은 극도로 제한적으로만 노출).",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 58,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "End the eye-level dolly directly ahead of 김지후(강수리영) in an extreme close-up, with her rigid eyes and arrested inhalation occupying most of the frame while a narrow trace of the barn remains at one edge. Hold the final distance without reframing, allowing only the tension in her jaw, nostrils, and locked shoulders to register.",
            "lighting_mood": "Subdued natural daytime ambience preserves the barn's darkness while sharply defining her strained expression.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "empty_goat_barn_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the old goat barn is completely empty, devoid of any goats or animals. The space is desolate and dark, illuminated only by subdued, low-contrast natural daytime ambient light that preserves deep shadows within the structure.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "텅 빈 축사",
                  "검은 염소만 없을 뿐",
                  "낡고 어두운 축사의 적막한 내부 전경",
                  "dark, low-contrast barn interior",
                  "a narrow trace of the barn remains at one edge",
                  "preserves the barn's darkness"
                ],
                "visual_inferences": [
                  "The barn consists of aged wooden or metal structures that contribute to the dark and gloomy atmosphere.",
                  "The background remains consistently out of focus or faintly visible behind the character in closer shots."
                ],
                "creative_decisions": [
                  "Maintain the exact low-key lighting and eerie emptiness across all views to emphasize the psychological tension of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 46,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "c64405bdcfb93cfa"
      },
      {
        "scene_index": 59,
        "heading": "60. 실내. 도축장 - 낮",
        "beat_title": "포대자루 속의 끔찍한 내용물 발견",
        "representative_moment": "풀어진 포대자루 틈새 밖으로 피범벅이 된 창백한 사람 팔 하나가 불쑥 튀어나와 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low-level close framing with stark, high-contrast midday daylight isolating the gruesome detail",
            "t2i_prompt": "Photorealistic cinematic still. A blood-covered pale human arm extends across the lower middle of the frame, protruding from the loosened opening of a heavy, coarse storage sack resting on the floor. The sack's opening faces diagonally forward, its rough fabric stained with dark-red blood. In the compressed background, the packed sides and tied ends of stacked, filled sacks overlap, framing the isolated limb. A blurred, textured edge of another coarse sack occupies the extreme foreground. Bright, harsh midday daylight strikes the floor, creating a stark, high-contrast illumination that sharply isolates the pale flesh against the grim, darkened crevices of the stacked sacks.",
            "outfit_assignments": [],
            "source_facts": [
              "A blood-covered human arm protrudes out of the sack",
              "Bright midday illumination present in the slaughterhouse"
            ],
            "visual_inferences": [
              "fixed_element coarse_storage_sacks: The rough, coarse fabric of the heavy storage sacks resting on the floor",
              "fixed_element slaughterhouse_daylight: intense external illumination creating a grim, high-contrast atmosphere"
            ],
            "creative_decisions": [
              "Positioned the camera just above floor level to emphasize the arm's proximity and the gruesome discovery",
              "Used a blurred foreground sack edge to create depth and anchor the viewer in the claustrophobic space without revealing the wider room",
              "Focused the harsh daylight directly onto the arm to maximize the contrast between the pale skin and the dark-red blood"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "animal remains",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "partition wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sack",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0707af4ecf64c672",
              "owned_hash": "d4dc8db4e9021a9d",
              "camera_direction_hash": "d0a120f80c0b9ebd",
              "owned_usage_hash": "0e22c646323ce02e",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 32,
        "dependency_reason": "Same slaughterhouse background established previously, though heavily restricted by close framing in this specific shot.",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 59,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just above floor level and within arm's reach, finish the dolly toward the loosened sack and settle into a nearly static close frame. Isolate the blood-covered pale arm across the lower middle of the image, with the sack opening and adjacent filled sacks providing scale and context rather than letting any single object exceed the frame.",
            "lighting_mood": "Bright midday illumination present in the slaughterhouse is restrained into a grim, high-contrast view of pale flesh and dark-red blood.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L25B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "slaughterhouse_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Bright, harsh midday daylight illuminates the slaughterhouse environment. The intense external illumination spills into open areas, creating a grim, high-contrast atmosphere that starkly reveals the surroundings against darker shadows.",
                "applies_to_shots": [
                  6,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "Bright midday illumination present in the slaughterhouse",
                  "Midday brightness beyond the opened doorway"
                ],
                "visual_inferences": [
                  "The light is exceptionally stark and desaturated, highlighting the gruesome details of the slaughterhouse."
                ],
                "creative_decisions": [
                  "Using unusually bright daytime lighting to make the slaughterhouse feel more exposed, unnatural, and unnerving."
                ],
                "confidence": "high"
              },
              {
                "element_id": "coarse_storage_sacks",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "The rough, coarse fabric of the heavy storage sacks resting on the floor. It appears in partial views, such as a loosened opening revealing contents or a blurred, textured edge serving as foreground cover.",
                "applies_to_shots": [
                  6,
                  16
                ],
                "element_scope": "close",
                "source_facts": [
                  "sack opening and adjacent filled sacks providing scale and context",
                  "faces nearly level above a blurred sack edge"
                ],
                "visual_inferences": [
                  "The sacks are made of thick, woven material, likely stained with dark blood from the hidden body parts."
                ],
                "creative_decisions": [
                  "Using the texture and edges of the sacks as localized foreground elements to anchor the characters in the gruesome reality of their hiding spot."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 32,
                "shot_index": 13,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "06712b11cec1d812"
      },
      {
        "scene_index": 59,
        "heading": "60. 실내. 도축장 - 낮",
        "beat_title": "열린 문턱과 발각의 위기",
        "representative_moment": "어두운 창고 안에서 바라본 시점, 밝은 대낮의 도축장 문턱에 포대자루를 짊어진 고산들과 청년들이 서 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low observer POV with stark high-contrast wide framing",
            "t2i_prompt": "Photorealistic cinematic still. Seen from a low observer position inside the pitch-black storage space, a fully opened storage doorway stands in the middle-center background, serving as a shared threshold. An Asian young man in a worn jacket stands planted across the middle of the doorway at a three-quarter angle from the right, his eyes looking off-screen. Behind and beside him, a cluster of Asian young men in fisher workwear stand at a three-quarter angle from the left, bracing the existing heavy filled sacks against their shoulders and backs, their gazes also directed off-screen. The dark interior forms a heavy silhouette in the immediate foreground, where the upper edges of the existing packed sacks cross the bottom frame. Beyond the door, harsh midday daylight floods the exterior slaughterhouse, creating a stark, desaturated, high-contrast atmosphere between the blinding outside and the claustrophobic shadows inside.",
            "outfit_assignments": [],
            "source_facts": [
              "S59 action: 창고 문이 열리며 산들, 청년들이 포대자루를 짊어지고 밖을 나서는 순간",
              "shot description: From a low position inside the storage space, complete the pan into a slightly widened view that contains the entire open threshold."
            ],
            "visual_inferences": [
              "fixed_element slaughterhouse_daylight: Bright, harsh midday daylight spilling into open areas, creating a grim, high-contrast atmosphere.",
              "fixed_element storage_interior_darkness: Deep, low-key shadows in the storage interior severely obscuring details and forming a foreground silhouette."
            ],
            "creative_decisions": [
              "Applied a low camera angle from the concealed viewpoint to emphasize vulnerability, using the stark contrast between the pitch-black foreground and the desaturated, bright exterior to build suspense."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "animal remains",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "a fully opened storage doorway stands in the middle-center background"
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "partition wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sack",
                "usage_kind": "anchor",
                "source_phrase": "bracing the existing heavy filled sacks against their shoulders and backs, where the upper edges of the existing packed sacks cross the bottom frame"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1ad6fa4ae697fd3b",
              "owned_hash": "d4dc8db4e9021a9d",
              "camera_direction_hash": "cc4f774110ca4a6b",
              "owned_usage_hash": "05995ebf7f1509ab",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "a fully opened storage doorway stands in the middle-center background, serving as a shared threshold",
                  "reason": "The prompt references the doorway as a spatial anchor to position the characters, which is consistent with the producer's anchor declaration and does not redesign or redraw the door.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sack",
                  "violating_phrase": "bracing the existing heavy filled sacks against their shoulders and backs",
                  "reason": "The prompt specifies interactions with the 'existing' sacks to set the poses of the characters and the foreground silhouette, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 59,
        "dependency_reason": "동일 씬 내 앞선 샷(Shot 6)의 도축장 내부 배경(exact_background) 연속성 및 창고 실내/외 조명 대비(fixed_elements) 유지",
        "_shot_index": 12,
        "visible_entities": [
          "L25"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 59,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a low position inside the storage space, complete the pan into a slightly widened view that contains the entire open threshold. 고산들 holds the middle of the doorway while the 금월도 마을 청년 cluster behind and beside him, several bracing filled sacks, with the storage interior forming a dark foreground border.",
            "lighting_mood": "Midday brightness beyond the opened doorway contrasts with the darker storage interior in a severe, desaturated composition.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "fully opened storage doorway",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "L25"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L25B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "animal remains",
              "door",
              "floor",
              "partition wall",
              "sack"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "slaughterhouse_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Bright, harsh midday daylight illuminates the slaughterhouse environment. The intense external illumination spills into open areas, creating a grim, high-contrast atmosphere that starkly reveals the surroundings against darker shadows.",
                "applies_to_shots": [
                  6,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "Bright midday illumination present in the slaughterhouse",
                  "Midday brightness beyond the opened doorway"
                ],
                "visual_inferences": [
                  "The light is exceptionally stark and desaturated, highlighting the gruesome details of the slaughterhouse."
                ],
                "creative_decisions": [
                  "Using unusually bright daytime lighting to make the slaughterhouse feel more exposed, unnatural, and unnerving."
                ],
                "confidence": "high"
              },
              {
                "element_id": "storage_interior_darkness",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the storage space is enveloped in deep, low-key shadows. This pervasive darkness forms a heavy background or foreground silhouette, severely obscuring details and contrasting sharply with the bright external daylight.",
                "applies_to_shots": [
                  12,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "storage interior forming a dark foreground border",
                  "closed storage darkness leaves their sweating, frightened faces in low-key contrast"
                ],
                "visual_inferences": [
                  "The storage room lacks any internal light sources or windows, plunging into near-total blackness when the door is closed."
                ],
                "creative_decisions": [
                  "Leveraging heavy shadows to heighten the characters' claustrophobia and raw terror as they hide."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 59,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L25B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "a150aba96eb7c9bf"
      },
      {
        "scene_index": 59,
        "heading": "60. 실내. 도축장 - 낮",
        "beat_title": "발각되지 않기 위해 조용히 숨어있음 → 생존의 위협을 느낌",
        "representative_moment": "굳게 닫힌 창고 문 안쪽 어둠 속에서 식은땀을 흘리며 두려움에 떠는 김지후(강수리영)와 정인우의 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At seated eye level, a tight close two-shot focusing on the characters' faces with low-key contrast.",
            "t2i_prompt": "Photorealistic cinematic still. At seated eye level, a tight close two-shot framed against [: deep, low-key shadows of the closed storage interior, creating a heavy dark background]. C01O01 in a casual outfit, a Korean early 20s woman with a pale oval face and long straight black hair, occupies the left foreground at a three-quarter angle from the right, crouched with a hand tightly clamped over her mouth, eyes fixed off-screen. Beside her, C03O04 in fishing wear, a Korean mid-20s man with short black hair, occupies the right foreground in left profile, hunched shoulder-to-shoulder with her, eyes fixed off-screen. Their sweating, frightened faces hover nearly level above the rough, coarse fabric of a blurred storage sack edge. The enveloping darkness leaves their features illuminated only in faint, low-key contrast, without a specific light source.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "closed storage darkness leaves their sweating, frightened faces in low-key contrast",
              "faces nearly level above a blurred sack edge",
              "crouched hand over mouth, hunched shoulder-to-shoulder"
            ],
            "visual_inferences": [
              "storage interior forms a dark background border due to the closed door",
              "coarse storage sacks provide a textured foreground cover",
              "The storage room lacks internal light sources, plunging into near-total blackness"
            ],
            "creative_decisions": [
              "Tight two-shot framing to heavily emphasize claustrophobia and raw terror in the faces",
              "Using the blurred edge of the coarse sack as a foreground element to anchor the characters while maintaining focus on their expressions",
              "Replaced L01 with L02 to describe the frame-edge background surface according to user constraints"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "animal remains",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "partition wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sack",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "66758191d21df0d0",
              "owned_hash": "d4dc8db4e9021a9d",
              "camera_direction_hash": "e32b69f8c4c1437a",
              "owned_usage_hash": "0e22c646323ce02e",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 59,
        "dependency_reason": "Shot 6의 공간적 특징(창고 내부의 포대자루와 어둠)을 연속적으로 공유하되, 배경 레퍼런스는 skip 하고 인물 클로즈업 중심으로 묘사",
        "_shot_index": 16,
        "visible_entities": [
          "C01",
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 59,
            "shot_index": 16
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At seated eye level inside the closed storage space, complete the dolly-in as a tight two-shot with the door kept entirely outside the frame. 김지후(강수리영) occupies the left foreground and 정인우 the right, their faces nearly level above a blurred sack edge as both compress themselves together and suppress their breathing.",
            "lighting_mood": "The closed storage darkness leaves their sweating, frightened faces in low-key contrast without identifying a specific light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L25B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "storage_interior_darkness",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the storage space is enveloped in deep, low-key shadows. This pervasive darkness forms a heavy background or foreground silhouette, severely obscuring details and contrasting sharply with the bright external daylight.",
                "applies_to_shots": [
                  12,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "storage interior forming a dark foreground border",
                  "closed storage darkness leaves their sweating, frightened faces in low-key contrast"
                ],
                "visual_inferences": [
                  "The storage room lacks any internal light sources or windows, plunging into near-total blackness when the door is closed."
                ],
                "creative_decisions": [
                  "Leveraging heavy shadows to heighten the characters' claustrophobia and raw terror as they hide."
                ],
                "confidence": "high"
              },
              {
                "element_id": "coarse_storage_sacks",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "The rough, coarse fabric of the heavy storage sacks resting on the floor. It appears in partial views, such as a loosened opening revealing contents or a blurred, textured edge serving as foreground cover.",
                "applies_to_shots": [
                  6,
                  16
                ],
                "element_scope": "close",
                "source_facts": [
                  "sack opening and adjacent filled sacks providing scale and context",
                  "faces nearly level above a blurred sack edge"
                ],
                "visual_inferences": [
                  "The sacks are made of thick, woven material, likely stained with dark blood from the hidden body parts."
                ],
                "creative_decisions": [
                  "Using the texture and edges of the sacks as localized foreground elements to anchor the characters in the gruesome reality of their hiding spot."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 59,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "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"
            ]
          },
          "render_contracts": [],
          "_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": "bc30ebff4c951429"
      },
      {
        "scene_index": 60,
        "heading": "Ext. Coastal Path - Day",
        "beat_title": "Discovery of the Corpse",
        "representative_moment": "A wave lifts the arm of a lifeless body wedged between the coastal rocks.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide composition, low observer height with a downward angle, subdued natural daylight with stark high-contrast",
            "t2i_prompt": "Photorealistic cinematic still. A wide composition from a low observer height aiming downward into the gap between the coastal rock formation and the sea. A lifeless Asian figure in wet dark clothing is wedged into the gap at a three-quarter angle from the left, lying motionless with the head turned off-screen. An incoming wave surges through, lifting one of the figure's arms upward so the raised limb cuts into the upper portion of the frame. The rough jagged rock surfaces and the sea are illuminated by subdued, bleak natural daylight, producing a stark high-contrast tonal separation around the pale body.",
            "outfit_assignments": [],
            "source_facts": [
              "S60 action: '갯바위와 바닷물 사이에 걸려 들썩이는 사람 형체... 사람의 시체다!'",
              "shot description: A human corpse wedged between coastal rocks and the seawater, a wave pushing its arm up into the air."
            ],
            "visual_inferences": [
              "fixed_element bleak_coastal_environment: The outdoor coastal setting features rough, jagged rocks meeting the sea water under natural daylight.",
              "The corpse's dark clothing contrasts with the pale body, enhancing the grim atmosphere."
            ],
            "creative_decisions": [
              "Wide composition aiming downward from a low height to capture both the constricting rocky gap and the raised arm cutting the upper frame.",
              "Subdued, bleak lighting with stark tonal separation highlights the lifeless body against the dark wet rocks."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "building",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drainpipe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "equipment case",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "evidence marker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "forensic sheet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "anchor",
                "source_phrase": "gap between the coastal rock formation"
              },
              {
                "owned_token": "scale ruler",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sea",
                "usage_kind": "anchor",
                "source_phrase": "and the sea"
              },
              {
                "owned_token": "seaweed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tide pool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tripod",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f81491d5775d4193",
              "owned_hash": "080e9de02323917a",
              "camera_direction_hash": "e9584a9b0ad5be4a",
              "owned_usage_hash": "94f81ff1aa4c032d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "rock",
                  "violating_phrase": "gap between the coastal rock formation",
                  "reason": "The rock is referenced as a spatial boundary and environmental surface, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sea",
                  "violating_phrase": "and the sea",
                  "reason": "The sea is mentioned as a natural spatial anchor and background lighting element, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 45,
        "dependency_reason": "Shares the exact background of the rocky coastal shoreline from S45_Shot8.",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 60,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the seaward side of the path at the specified low height, finish the push five meters from the body with a downward angle into the gap between the rocks and water. Hold a wide composition at the instant an incoming wave lifts one arm, keeping the lodged torso and surrounding rocks legible while the raised limb cuts into the upper portion of the frame.",
            "lighting_mood": "Natural daylight over the coast is treated with restrained color and stark tonal separation around the pale body.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L27B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "building",
              "camera",
              "drainpipe",
              "equipment case",
              "evidence marker",
              "forensic sheet",
              "path",
              "railing",
              "rock",
              "scale ruler",
              "sea",
              "seaweed",
              "tide pool",
              "tripod"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "bleak_coastal_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor coastal setting features rough, jagged rocks meeting the sea water under natural daylight. The environmental lighting is characterized by a subdued, stark, and high-contrast palette with restrained colors. This bleak atmosphere maintains visual consistency across the rocky shoreline background.",
                "applies_to_shots": [
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daylight over the coast is treated with restrained color and stark tonal separation.",
                  "Natural coastal daylight keeps his rigid profile and the phone clearly legible within a subdued, high-contrast palette."
                ],
                "visual_inferences": [
                  "Both shots share the same rocky coastal background and daytime lighting conditions, maintaining visual continuity despite framing different subjects."
                ],
                "creative_decisions": [
                  "Using subdued colors and stark tonal separation to emphasize the shocking and grim nature of discovering the washed-up corpse."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 45,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L27B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "576dcd06d9c44097"
      },
      {
        "scene_index": 60,
        "heading": "61. 실외. 해안길 - 낮",
        "beat_title": "시체 발견과 기록",
        "representative_moment": "C03 braces his phone to take a picture of the body off-screen.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium side profile at chest height, subdued high-contrast daylight",
            "t2i_prompt": "Photorealistic cinematic still. Shot at chest height, waist-up visible in the frame. C03O04 in fisher workwear, a Korean young man in his 20s, stands in right profile occupying the left half of the frame. He is bracing a mobile phone with both hands, holding it forward toward the right edge, his eyes fixed off-screen. The phone's camera points rightward. The background features a bleak outdoor coastal setting with rough, jagged rocks meeting the sea under natural daylight. The environmental lighting is characterized by a subdued, stark, and high-contrast palette with restrained colors, keeping his rigid profile and the phone clearly legible against the rocky shoreline.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "S60 action: '본능적으로 핸드폰을 꺼내 증거 사진을 찍는 인우.'",
              "shot description: 핸드폰 카메라를 바다 쪽 시체를 향해 겨눈 채 굳은 표정으로 서 있는 정인우의 측면."
            ],
            "visual_inferences": [
              "fixed_element bleak_coastal_environment: rough, jagged rocks meeting the sea water under subdued high-contrast daylight",
              "chest-height medium profile framing matches his action of holding the phone up to take a picture",
              "waist-up framing naturally implies his legs are beyond the lower frame edge, consistent with the camera height"
            ],
            "creative_decisions": [
              "Placed C03 on the left half of the frame facing right to provide clear lateral direction for the camera axis",
              "Used stark, high-contrast daylight to emphasize the grim mood of finding a corpse"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "building",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "camera",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drainpipe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "equipment case",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "evidence marker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "forensic sheet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "anchor",
                "source_phrase": "rough, jagged rocks"
              },
              {
                "owned_token": "scale ruler",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sea",
                "usage_kind": "anchor",
                "source_phrase": "meeting the sea"
              },
              {
                "owned_token": "seaweed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tide pool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tripod",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1021ccd81d24059b",
              "owned_hash": "080e9de02323917a",
              "camera_direction_hash": "8538a3d569d4b1f1",
              "owned_usage_hash": "34bf8214ec79f6c8",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "rock",
                  "violating_phrase": "rough, jagged rocks",
                  "reason": "The prompt describes rocks as a background environmental feature ('rough, jagged rocks meeting the sea'), which is a valid anchor reference that does not demand redrawing.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sea",
                  "violating_phrase": "meeting the sea",
                  "reason": "The prompt mentions the sea as part of the background coastal environment, which is a valid anchor reference that does not demand redrawing.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 60,
        "dependency_reason": "Shares the same rocky coastal background and daytime lighting conditions as Shot 6.",
        "_shot_index": 9,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 60,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 정인우's chest height and perpendicular to his sightline, let the lateral track settle into a static-feeling medium side profile. Place him on the left half with both hands holding the phone forward toward the right edge; the device remains proportionate and its camera axis continues cleanly toward the off-screen body.",
            "lighting_mood": "Natural coastal daylight keeps his rigid profile and the phone clearly legible within a subdued, high-contrast palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L27B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "building",
              "camera",
              "drainpipe",
              "equipment case",
              "evidence marker",
              "forensic sheet",
              "path",
              "railing",
              "rock",
              "scale ruler",
              "sea",
              "seaweed",
              "tide pool",
              "tripod"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "bleak_coastal_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor coastal setting features rough, jagged rocks meeting the sea water under natural daylight. The environmental lighting is characterized by a subdued, stark, and high-contrast palette with restrained colors. This bleak atmosphere maintains visual consistency across the rocky shoreline background.",
                "applies_to_shots": [
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daylight over the coast is treated with restrained color and stark tonal separation.",
                  "Natural coastal daylight keeps his rigid profile and the phone clearly legible within a subdued, high-contrast palette."
                ],
                "visual_inferences": [
                  "Both shots share the same rocky coastal background and daytime lighting conditions, maintaining visual continuity despite framing different subjects."
                ],
                "creative_decisions": [
                  "Using subdued colors and stark tonal separation to emphasize the shocking and grim nature of discovering the washed-up corpse."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 60,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
              },
              {
                "kind": "background",
                "id": "L27B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "59adb59136ccf692"
      },
      {
        "scene_index": 61,
        "heading": "62. 실외. 금월도 선착장 - 해질녘",
        "beat_title": "처참한 시체와 은폐",
        "representative_moment": "마을 사람들이 둥글게 둘러선 선착장 바닥 포대 위에 가슴에 깊은 상처가 난 C10이 죽은 채 누워있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide diagonal composition from waist height with muted gold sunset grading and deep shadows",
            "t2i_prompt": "Photorealistic cinematic still. C10O13 in torn fishing clothes, a Korean middle-aged man, lies motionless in the lower-center midground. He rests supine on a spread vinyl sheet on the shared dock ground, positioned at three-quarter angle from the right, gaze fixed off-screen with lifeless eyes, his chest visibly wounded with a sharp torn gash exposing tissue beneath the fabric. In the background across the same dock ground, a gathering of Korean villagers stands at three-quarter angle from the left. They form an uneven ring around the sheet, leaning inward and looking down at the body. Seen from a waist-height camera perspective, the flat dock surface occupies the lower frame. Fading sunset illumination bathes the outdoor environment in subdued warm golden tones, casting deep, restrained high-contrast shadows over the gathering.",
            "outfit_assignments": [
              {
                "character_id": "C10",
                "outlook_id": "O13"
              }
            ],
            "source_facts": [
              "해질녘",
              "김여상의 시체가 넓게 펼친 비닐 포대 위에 누워있다",
              "가슴팍에 짐승 같은 것이 제대로 할퀸 것 같은 날카로운 상처",
              "마을 사람들이 주변에서 웅성대며 시체를 구경한다"
            ],
            "visual_inferences": [
              "fixed_element sunset_dock_lighting: fading sunset with subdued warm golden tones and deep contrast shadows",
              "waist-height camera capturing the wide layout of the body and the surrounding ring of villagers in a diagonal composition"
            ],
            "creative_decisions": [
              "Placed the body in the lower-center midground to anchor the composition, emphasizing vulnerability against the looming ring of villagers in the background.",
              "Utilized deep, high-contrast sunset shadows to enhance the grim and suspenseful tone of the occult thriller."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7ebbd791db88355a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "6286e087fb331811",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 57,
        "dependency_reason": "금월도 선착장의 배경 및 일몰 시간대 조명(sunset_dock_lighting) 연속성 유지",
        "_shot_index": 1,
        "visible_entities": [
          "C10"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 61,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From waist height at the gathering's outer edge, begin a slow inward move across the dock in a wide diagonal composition. 김여상 lies in the lower center on the spread sheet while the gathered 금월도 마을 주민 form an uneven background ring, leaving the body and its torn fishing clothes unmistakably exposed.",
            "lighting_mood": "Fading sunset illumination is graded toward muted gold and deep, restrained shadows without softening the corpse's condition.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김여상",
                  "screen_zone": "lower_center",
                  "target_id": "C10",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C10",
                "outlook_id": "O13"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sunset_dock_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor dock environment is bathed in a fading sunset, featuring subdued warm golden tones. Deep, restrained high-contrast shadows cover the surroundings, maintaining a consistent low-key late afternoon atmosphere across the location.",
                "applies_to_shots": [
                  1,
                  12,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질녘",
                  "Fading sunset illumination is graded toward muted gold and deep, restrained shadows",
                  "Sunset light is held in subdued warm tones and deep contrast",
                  "Low-key sunset ambience appropriate to the harbor"
                ],
                "visual_inferences": [
                  "The lighting explicitly reflects the closing of the day and heightens the tension with deep contrasting shadows."
                ],
                "creative_decisions": [
                  "Maintain the precise golden hour color grading and heavy shadow ratio to connect the wide landscape and tight medium shots visually."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 57,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "4d4bd599b82cade3"
      },
      {
        "scene_index": 61,
        "heading": "62. 실외. 금월도 선착장 - 해질녘",
        "beat_title": "정인우를 압박하는 구창모",
        "representative_moment": "경찰이 거리를 좁히며 다가오자, 남자가 상체를 뒤로 물리며 방어적인 자세를 취하고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "waist-height side observer view with deep high-contrast sunset lighting",
            "t2i_prompt": "Photorealistic cinematic still. Waist-height observer view, the heads, torsos, and arms of two men visible in the frame while their lower legs extend beyond the bottom edge. On the left, an East Asian middle-aged man in a police uniform stands in right profile, leaning aggressively into the other's space with his weight shifted forward, his eyes fixed on the man opposite him. On the right, an East Asian man in his 30s in a dark jacket stands in left profile across the shared dock ground, keeping his body weight visibly shifted and braced backward in a defensive posture, his eyes fixed on the police officer. The shared dock ground around them is occupied by gathered villagers standing in the background, observing the confrontation. The environment is bathed in a fading sunset, featuring subdued warm golden tones. Deep, restrained high-contrast shadows cover the surroundings, maintaining a consistent low-key late afternoon atmosphere that sharpens the authority imbalance between the two profiles.",
            "outfit_assignments": [],
            "source_facts": [
              "경찰복 차림의 구창모가 인우 가까이로 다가선다",
              "weight braced rearward, defensive and hesitant physical position",
              "gathered villagers around the dock",
              "fading sunset illumination, subdued warm golden tones, deep restrained high-contrast shadows"
            ],
            "visual_inferences": [
              "The police officer's forward weight shift invades the other man's personal space, asserting authority.",
              "The defensive backward bracing emphasizes the younger man's inability to escape the confrontation.",
              "Waist-height side framing captures the upper body tension while adhering to camera geometric rules (feet implied beyond the bottom edge)."
            ],
            "creative_decisions": [
              "Set the two subjects in a strict profile-to-profile standoff to highlight the power imbalance.",
              "Used deep shadows and muted golden hour light to create a heavy, suffocating mood reflecting the isolated island setting."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "777bc5a1f6f42fb5",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9bafd9453f8c2270",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 57,
        "dependency_reason": "금월도 선착장의 해질녘 조명 및 분위기 연속성 유지",
        "_shot_index": 12,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 61,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At waist height to the side of 정인우, end the diagonal retreat in a full-body two-profile composition. 구창모 presses into the left side with his weight forward while 정인우 holds the right at barely an arm's length, braced rearward but refusing to leave the shared axis.",
            "lighting_mood": "Sunset light is held in subdued warm tones and deep contrast, sharpening the authority imbalance between the two profiles.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sunset_dock_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor dock environment is bathed in a fading sunset, featuring subdued warm golden tones. Deep, restrained high-contrast shadows cover the surroundings, maintaining a consistent low-key late afternoon atmosphere across the location.",
                "applies_to_shots": [
                  1,
                  12,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질녘",
                  "Fading sunset illumination is graded toward muted gold and deep, restrained shadows",
                  "Sunset light is held in subdued warm tones and deep contrast",
                  "Low-key sunset ambience appropriate to the harbor"
                ],
                "visual_inferences": [
                  "The lighting explicitly reflects the closing of the day and heightens the tension with deep contrasting shadows."
                ],
                "creative_decisions": [
                  "Maintain the precise golden hour color grading and heavy shadow ratio to connect the wide landscape and tight medium shots visually."
                ],
                "confidence": "high"
              },
              {
                "element_id": "inwoo_defensive_posture",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "The man stands in a side profile facing left, keeping his body weight visibly shifted and braced backward. His stance reflects a defensive and hesitant physical position as his path and actions are blocked by others.",
                "applies_to_shots": [
                  12,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "profile_left, weight braced rearward (Shot 12)",
                  "profile_left, weight held back (Shot 16)"
                ],
                "visual_inferences": [
                  "His physical posture remains consistently intimidated or physically arrested by the locals confronting him."
                ],
                "creative_decisions": [
                  "Ensure his body language visibly conveys his inability to move forward, emphasizing the power imbalance."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 57,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "685b127895f20950"
      },
      {
        "scene_index": 61,
        "heading": "62. 실외. 금월도 선착장 - 해질녘",
        "beat_title": "정인우의 탈출 시도 좌절",
        "representative_moment": "강영란이 손을 뻗어 고산들의 가슴을 막아서고, 그 뒤에서 정인우가 뒤로 물러서며 길이 막힌 정지 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium side-on composition at chest-height, fading sunset with high-contrast shadows",
            "t2i_prompt": "Photorealistic cinematic still. A medium side-on composition at chest-height framing three figures from the waist up on the shared wooden dock. On the left, a young Asian man in dark workwear, in right profile, caught in arrested stride, eyes fixed on the woman. In the center, an older Asian woman with white hair in muted clothing, at three-quarter angle from the right, her planted palm braced across the young man's chest at frame center, eyes fixed on the man to the right. On the right, an Asian man in a casual jacket, in left profile, his body weight visibly shifted and braced backward in a defensive posture, eyes fixed on the woman. The open passage behind the woman's restraining arm establishes the blocked route along the shared dock. A police patrol boat rests at the distant right edge behind the defensive man, its angled side and hull visible. The scene is bathed in a fading sunset with subdued warm golden tones and deep restrained high-contrast shadows, maintaining a low-key late afternoon atmosphere.",
            "outfit_assignments": [],
            "source_facts": [
              "강영란(흰 머리 여자)'s planted palm against 고산들's chest at frame center.",
              "고산들 is caught on the left with his forward step arrested.",
              "정인우 remains beyond them on the blocked route at frame right.",
              "Police patrol boat held in the distant edge behind 정인우."
            ],
            "visual_inferences": [
              "fixed_element sunset_dock_lighting: fading sunset, subdued warm golden tones, deep restrained high-contrast shadows.",
              "fixed_element inwoo_defensive_posture: body weight visibly shifted and braced backward."
            ],
            "creative_decisions": [
              "Employed a chest-height side pan to align the central hand-to-chest contact perfectly at frame center while framing all three characters from the waist up.",
              "Used the shared wooden dock explicitly to physically anchor the separated foreground and background figures in the same continuous space."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "266239525876c4a8",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b7e8403ce2de05dd",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 57,
        "dependency_reason": "같은 공간(금월도 선착장)에서 이루어지는 사건이므로 선착장의 배경 및 시각적 일관성을 유지해야 함",
        "_shot_index": 16,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 61,
            "shot_index": 16
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the chest-height side pan into a medium side-on composition, tightening just enough to place 강영란(흰 머리 여자)'s planted palm against 고산들's chest at frame center. 고산들 is caught on the left with his forward step arrested, 강영란(흰 머리 여자) braces across the middle, and 정인우 remains beyond them on the blocked route at frame right, preserving all three layers of the intervention.",
            "lighting_mood": "Low-key sunset ambience appropriate to the harbor holds the figures in restrained contrast without obscuring the central hand-to-chest contact.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sunset_dock_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor dock environment is bathed in a fading sunset, featuring subdued warm golden tones. Deep, restrained high-contrast shadows cover the surroundings, maintaining a consistent low-key late afternoon atmosphere across the location.",
                "applies_to_shots": [
                  1,
                  12,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "해질녘",
                  "Fading sunset illumination is graded toward muted gold and deep, restrained shadows",
                  "Sunset light is held in subdued warm tones and deep contrast",
                  "Low-key sunset ambience appropriate to the harbor"
                ],
                "visual_inferences": [
                  "The lighting explicitly reflects the closing of the day and heightens the tension with deep contrasting shadows."
                ],
                "creative_decisions": [
                  "Maintain the precise golden hour color grading and heavy shadow ratio to connect the wide landscape and tight medium shots visually."
                ],
                "confidence": "high"
              },
              {
                "element_id": "inwoo_defensive_posture",
                "element_type": "character_state",
                "character_name": "정인우",
                "description": "The man stands in a side profile facing left, keeping his body weight visibly shifted and braced backward. His stance reflects a defensive and hesitant physical position as his path and actions are blocked by others.",
                "applies_to_shots": [
                  12,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "profile_left, weight braced rearward (Shot 12)",
                  "profile_left, weight held back (Shot 16)"
                ],
                "visual_inferences": [
                  "His physical posture remains consistently intimidated or physically arrested by the locals confronting him."
                ],
                "creative_decisions": [
                  "Ensure his body language visibly conveys his inability to move forward, emphasizing the power imbalance."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 57,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "986abc33ec19cc0d"
      },
      {
        "scene_index": 62,
        "heading": "63. 실외. 경찰 순찰정 - 저녁",
        "beat_title": "시체를 뒤져 금품을 챙기는 부패 경찰",
        "representative_moment": "어두운 저녁 바다 위, 경찰복을 입은 C15가 시체에서 빼낸 젖은 현금과 반지를 쥐고 탐욕스럽게 웃는다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low camera beside the deck, looking slightly up at the figure",
            "t2i_prompt": "Photorealistic cinematic still. A low observer at deck level looking up, the upper body of C15O18 in a dark weather-resistant jacket, a Korean middle-aged man, filling the frame in a close composition. The figure is at three-quarter angle from the left, head lowered, looking down with a greedy smile. His raised fist enters the lower third of the frame, gripping wet cash with printed faces turned toward the camera, and a ring resting against the damp bills. The figure and his fist occupy most of the frame, sharply focused against the soft, dim early-evening ambient light. A narrow out-of-focus strip of the boat deck is visible beneath his arm, and the dark ocean forms the blurred background toward the right edge. Deep shadows trace his jawline and shoulders, preserving his slightly unkempt appearance in the low-key twilight hue.",
            "outfit_assignments": [
              {
                "character_id": "C15",
                "outlook_id": "O18"
              }
            ],
            "source_facts": [
              "창모가 갑자기 배를 멈추고 시체를 뒤져 반지, 현금 등을 찾아 집어 넣는다",
              "어둑해진 초저녁 바다를 달리는 창모의 배",
              "탐욕스러운 미소를 짓는 구창모의 얼굴 클로즈업",
              "시체에서 빼낸 반지와 젖은 현금을 쥐고 있음"
            ],
            "visual_inferences": [
              "dim_evening_sea_environment: open sea during early evening, dark moody atmosphere, low-key ambient light casting deep shadows",
              "gu_chang_mo_police_attire: dark, utilitarian weather-resistant jacket for evening sea patrols, rugged and unkempt appearance"
            ],
            "creative_decisions": [
              "Close framing focusing entirely on Gu Chang-mo's greedy expression and the stolen loot in his raised hand",
              "Low-key cool twilight ambient light to emphasize the secretive, corrupt nature of the act",
              "Soft background to isolate the character and hide distant details"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "388c52978bfb2ab6",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a1ac11c236accd26",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 56,
        "dependency_reason": "같은 배 위에서의 야간 톤(dim_evening_sea_environment) 유지 필요. (prior shot S56_Shot7에서 location reference)",
        "_shot_index": 4,
        "visible_entities": [
          "C15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 62,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From below 구창모's eye line beside the deck, finish the dolly-in on a close view of his greedy smile while his raised fist enters the lower third. The wet cash and ring remain clearly legible in his hand but occupy less than a quarter of the image, with enough deck and open water retained at the edges to prepare the coming pan away.",
            "lighting_mood": "Dim early-evening ambient light over the sea keeps the image low-key while preserving the wet cash, ring, and predatory smile.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C15",
                "outlook_id": "O18"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dim_evening_sea_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The setting is the open sea during the early evening, surrounded by a dark and moody atmosphere. Dim, low-key ambient lighting blankets the area, casting deep shadows over the water and the visible parts of the boat deck. This subdued lighting remains consistent, obscuring distant details while keeping the immediate foreground elements and subjects sufficiently visible.",
                "applies_to_shots": [
                  4,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "Dim early-evening ambient light over the sea keeps the image low-key",
                  "Low-key evening ambience over the dark sea reduces the boats to restrained shapes"
                ],
                "visual_inferences": [
                  "The ambient light provides a cool, twilight hue, emphasizing the secretive and illicit nature of the interaction on the water."
                ],
                "creative_decisions": [
                  "Keep the background strictly low-key to isolate the characters and their boats against the vast, dark ocean."
                ],
                "confidence": "high"
              },
              {
                "element_id": "gu_chang_mo_police_attire",
                "element_type": "character_state",
                "character_name": "Gu Chang-mo",
                "description": "Gu Chang-mo maintains his base appearance as a corrupt maritime police officer operating on the water. He wears a dark, utilitarian weather-resistant jacket or uniform suitable for evening sea patrols. His overall presentation remains rugged and slightly unkempt, matching his morally compromised actions.",
                "applies_to_shots": [
                  4,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "구창모가 표면상 경찰의 본분대로 시체를 온전히 육지로 이송하는 것처럼 달림",
                  "경찰 순찰정 - 저녁"
                ],
                "visual_inferences": [
                  "Given his role as the sole operator of the police patrol boat in the evening, he is wearing appropriate standard-issue but casually worn outerwear."
                ],
                "creative_decisions": [
                  "Avoid making his uniform look too crisp; a slightly worn or messy appearance reinforces his corrupt character."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 56,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C15O18",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "bd874143624c2246"
      },
      {
        "scene_index": 62,
        "heading": "실외. 경찰 순찰정 - 저녁",
        "beat_title": "은밀하고 소름 돋는 공모",
        "representative_moment": "어둠이 깔린 바다 위, 구창모(C15)와 황봉업이 두 배 사이의 좁은 틈을 두고 의미심장한 시선을 교환한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium two-shot across a narrow gap, low-key evening ambience",
            "t2i_prompt": "Photorealistic cinematic still. C15O18 in a dark weather-resistant jacket, an Asian man in his 40s, stands in the middle-right midground at three-quarter angle from the left, looking toward the fisherman across the boat gap, with a narrow gap between the adjacent boats dividing the space in the lower-center foreground. A middle-aged Asian man in fisher workwear stands opposite him at frame left, seen at three-quarter angle from the right, leaning subtly toward the center. Both men's shoulders are angled toward the gap, their eyes locked across the center seam. Fragments of their separate boat decks are visible at the lower left and lower right edges, proving they occupy different vessels. The dark, open sea stretches into the distance, framed through the central gap as negative space. Dim, low-key evening ambient light casts deep shadows over the water and the visible parts of the boat decks, maintaining a cool twilight hue that keeps both men's eyes readable in the heavy shadows.",
            "outfit_assignments": [
              {
                "character_id": "C15",
                "outlook_id": "O18"
              }
            ],
            "source_facts": [
              "The setting is the open sea during the early evening, surrounded by a dark and moody atmosphere.",
              "Gu Chang-mo wears a dark, utilitarian weather-resistant jacket or uniform suitable for evening sea patrols.",
              "황봉업의 낚시 어선이 경찰선 쪽으로 접근해 있는 상태"
            ],
            "visual_inferences": [
              "The ambient light provides a cool, twilight hue, emphasizing the secretive nature of the interaction.",
              "Fragments of the two separate boats remain at the lower edges to establish spatial separation.",
              "Hwang (unregistered character) wears fisher workwear fitting his role as a fishing boat operator."
            ],
            "creative_decisions": [
              "Framed the dark sea as negative space through the gap between the boats to visually anchor the isolating and suspenseful mood.",
              "Placed both men at three-quarter profiles leaning inward to emphasize the conspiratorial tension in the medium two-shot."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0ed65d95ecd537b4",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "7724d95547b7bf0b",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 62,
        "dependency_reason": "같은 씬 내 이전 샷들의 저녁 바다와 저조도 조명 환경 연속성 유지",
        "_shot_index": 9,
        "visible_entities": [
          "C15",
          "L38"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 62,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "End the eye-level lateral track in a tightened two-shot across the narrow gap between the adjacent boats, placing 황봉업(황 씨) at frame left and 구창모 at frame right. Both men lean subtly toward the gap as their eyes lock across the center seam, while fragments of each boat remain at the lower edges to prove that they occupy separate decks.",
            "lighting_mood": "Low-key evening ambience over the dark sea reduces the boats to restrained shapes while keeping both men's eyes readable.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "narrow gap between the adjacent boats",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "황봉업 across the boat gap",
                  "label": "구창모",
                  "screen_zone": "middle_right",
                  "target_id": "C15",
                  "target_kind": "character"
                }
              ]
            },
            "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": [
              "C15",
              "L38"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C15",
                "outlook_id": "O18"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dim_evening_sea_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The setting is the open sea during the early evening, surrounded by a dark and moody atmosphere. Dim, low-key ambient lighting blankets the area, casting deep shadows over the water and the visible parts of the boat deck. This subdued lighting remains consistent, obscuring distant details while keeping the immediate foreground elements and subjects sufficiently visible.",
                "applies_to_shots": [
                  4,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "Dim early-evening ambient light over the sea keeps the image low-key",
                  "Low-key evening ambience over the dark sea reduces the boats to restrained shapes"
                ],
                "visual_inferences": [
                  "The ambient light provides a cool, twilight hue, emphasizing the secretive and illicit nature of the interaction on the water."
                ],
                "creative_decisions": [
                  "Keep the background strictly low-key to isolate the characters and their boats against the vast, dark ocean."
                ],
                "confidence": "high"
              },
              {
                "element_id": "gu_chang_mo_police_attire",
                "element_type": "character_state",
                "character_name": "Gu Chang-mo",
                "description": "Gu Chang-mo maintains his base appearance as a corrupt maritime police officer operating on the water. He wears a dark, utilitarian weather-resistant jacket or uniform suitable for evening sea patrols. His overall presentation remains rugged and slightly unkempt, matching his morally compromised actions.",
                "applies_to_shots": [
                  4,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "구창모가 표면상 경찰의 본분대로 시체를 온전히 육지로 이송하는 것처럼 달림",
                  "경찰 순찰정 - 저녁"
                ],
                "visual_inferences": [
                  "Given his role as the sole operator of the police patrol boat in the evening, he is wearing appropriate standard-issue but casually worn outerwear."
                ],
                "creative_decisions": [
                  "Avoid making his uniform look too crisp; a slightly worn or messy appearance reinforces his corrupt character."
                ],
                "confidence": "medium"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 62,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C15O18",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "ebb8d2428768dbbd"
      },
      {
        "scene_index": 63,
        "heading": "64. 실내. 반월 식당 - 밤",
        "beat_title": "섬뜩한 감시",
        "representative_moment": "마을 청년들이 창밖에서 기괴한 웃음을 지으며 안을 들여다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "standing eye-level medium framing through foreground lattice, low-key night lighting",
            "t2i_prompt": "Photorealistic cinematic still. Looking out from just inside the lattice window in the foreground, at standing eye-level. A group of Asian young men cluster in the exterior passage behind the window grid, occupying the medium frame. They face the camera, leaning toward the window, their eyes fixed on the camera with conspicuous, unsettling smiles. The space is enveloped in low-key, dim night illumination, casting the window grid in heavy silhouette, strongly separated from the youths' features in the dark.",
            "outfit_assignments": [],
            "source_facts": [
              "마을 청년들이 창밖에서 식당 쪽을 지켜보며 킬킬 웃고 있음",
              "감시가 노골적임",
              "Youths cluster behind the grid near frame center, leaning toward the dining room with unsettling smiles."
            ],
            "visual_inferences": [
              "restaurant_low_key_lighting: The interior of the restaurant is enveloped in low-key, dim night illumination, creating a dark and restrained atmosphere.",
              "The interior window frame acts as a dark foreground silhouette against the exterior passage."
            ],
            "creative_decisions": [
              "Medium framing at standing eye level to naturally frame the youths' faces within the lattice grid.",
              "Using heavy foreground shadow on the window to emphasize the separation between the trapped interior and the watchers outside."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boarding gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "anchor",
                "source_phrase": "cluster in the exterior passage"
              },
              {
                "owned_token": "patrol boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "safety rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "Looking out from just inside the lattice window in the foreground"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "38b3456388bd768b",
              "owned_hash": "557e833aa6e02f2e",
              "camera_direction_hash": "d5a3f05754734615",
              "owned_usage_hash": "c8fa8767d60d49b7",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "passage",
                  "violating_phrase": "cluster in the exterior passage",
                  "reason": "The prompt uses the passage purely as a spatial location for the characters to stand, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "lattice window in the foreground... window grid",
                  "reason": "The window is used as a silhouetted framing device and spatial anchor without any instructions to rebuild or change its structure, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 63,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Remain just inside the lattice window at standing eye level and narrow the outward medium-long view so the 금월도 마을 청년들 cluster behind the grid near frame center. Their faces appear in separate lattice openings as they lean toward the dining room and answer the interior gaze with conspicuous, unsettling smiles.",
            "lighting_mood": "Night illumination appropriate to the restaurant interior and exterior keeps the lattice strongly separated from the youths' readable smiles without inventing an additional source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "격자무늬 나무 창",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L38B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench",
              "boarding gate",
              "deck",
              "door",
              "mast",
              "navigation unit",
              "passage",
              "patrol boat",
              "safety rail",
              "wheelhouse",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_low_key_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the restaurant is enveloped in low-key, dim night illumination, creating a dark and restrained atmosphere. Heavy shadows dominate the space, serving to emphasize sharp contrasts and vivid accents like bright red without flooding the room with light.",
                "applies_to_shots": [
                  2,
                  8,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Night illumination appropriate to the restaurant interior",
                  "Low-key restaurant lighting preserves the scene's restrained darkness",
                  "Low-key restaurant light holds her features in hard emotional contrast"
                ],
                "visual_inferences": [
                  "The light source is likely minimal overhead or faint ambient light, casting deep shadows in the corners of the room."
                ],
                "creative_decisions": [
                  "Utilizing a highly restricted color palette in the environment to make the blood and raw meat stand out aggressively against the darkness."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L38B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "45f0d7e3c60e0278"
      },
      {
        "scene_index": 63,
        "heading": "실내. 반월 식당 - 밤",
        "beat_title": "본능의 봉인 해제와 핏빛 폭식",
        "representative_moment": "김지후(강수리영)가 피투성이가 된 입과 두 손으로 생고기를 미친 듯이 입에 밀어 넣고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight upper-body close framing at seated eye level, low-key lighting with sharp red color contrast",
            "t2i_prompt": "Photorealistic cinematic still. The same Asian young woman in a dark jacket, hunched over at three-quarter angle from the right, captured in a tight upper-body close framing at seated eye level. Her gaze is looking down, with one hand forcing a large fold of explicitly red raw meat into her crowded mouth, and the other hand clawing toward the serving plate. Her mouth area and both of her hands are heavily covered and smeared with vivid, wet red blood, the deep crimson stains contrasting starkly against her bare skin. The same table surface is visible along the lower frame edge. The same dim room environment is preserved as a soft out-of-focus background, enveloped in low-key night illumination and heavy shadows, rendering the bloody raw meat as the sharpest color accent in the restrained darkness.",
            "outfit_assignments": [],
            "source_facts": [
              "수리영은 본능을 참지 못한 것처럼 생고기를 한 점 입에 넣더니… 우적우적 씹기 시작한다.",
              "입은 이미 핏빛이고, 두 손도 피로 범벅이지만 멈출 수가 없다.",
              "shot description: finish the push-in as a tight upper-body close framing with her face set slightly off-center and both hands rising from the lower frame."
            ],
            "visual_inferences": [
              "fixed_element jihoo_blood_stains: mouth area and both of her hands are heavily covered and smeared with vivid, wet red blood.",
              "fixed_element restaurant_low_key_lighting: low-key, dim night illumination, heavy shadows dominate the space."
            ],
            "creative_decisions": [
              "Applied a tight upper-body close framing to isolate her horrifying loss of control while maintaining the seated eye-level geometric constraints.",
              "Used a soft out-of-focus background to comply with close framing rules, keeping the vivid red blood as the dominant visual anchor."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blood",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boarding gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passageway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "safety rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sea",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d93e26cf0094c1c6",
              "owned_hash": "ffd873d8fb4f5c58",
              "camera_direction_hash": "82c49858ba9e5172",
              "owned_usage_hash": "0bb600e7e87a1f57",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 63,
        "dependency_reason": "zoom_in_detail 룰에 따라 앞선 샷(Shot 2)의 공간(조명, 분위기)과 동일 인물의 연속성을 유지하며, 특정 하위 영역(상반신 클로즈업)을 구체적으로 묘사함.",
        "_shot_index": 8,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 63,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 김지후(강수리영)'s seated eye level beside the table, finish the push-in as a tight upper-body close framing with her face set slightly off-center and both hands rising from the lower frame. One hand forces a large fold of raw meat into her crowded mouth while the other claws toward the serving plate, leaving the blood-marked table edge visible as spatial evidence.",
            "lighting_mood": "Low-key restaurant lighting preserves the scene's restrained darkness while the explicitly red raw meat and blood become the sharpest color accents.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L38B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_low_key_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the restaurant is enveloped in low-key, dim night illumination, creating a dark and restrained atmosphere. Heavy shadows dominate the space, serving to emphasize sharp contrasts and vivid accents like bright red without flooding the room with light.",
                "applies_to_shots": [
                  2,
                  8,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Night illumination appropriate to the restaurant interior",
                  "Low-key restaurant lighting preserves the scene's restrained darkness",
                  "Low-key restaurant light holds her features in hard emotional contrast"
                ],
                "visual_inferences": [
                  "The light source is likely minimal overhead or faint ambient light, casting deep shadows in the corners of the room."
                ],
                "creative_decisions": [
                  "Utilizing a highly restricted color palette in the environment to make the blood and raw meat stand out aggressively against the darkness."
                ],
                "confidence": "high"
              },
              {
                "element_id": "jihoo_blood_stains",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Kim Ji-hoo (Kang Soo-ri-young)'s mouth area and both of her hands are heavily covered and smeared with vivid, wet red blood. The deep crimson stains contrast starkly against her bare skin, remaining a prominent and horrifying localized detail on her face and hands.",
                "applies_to_shots": [
                  8,
                  14
                ],
                "element_scope": "close",
                "source_facts": [
                  "입가로 붉은 피가 흘러내리지만",
                  "두 손도 피로 범벅이지만",
                  "피로 흥건한 자기 손을 본다",
                  "explicitly red raw meat and blood become the sharpest color accents",
                  "suspended, blood-covered hands"
                ],
                "visual_inferences": [
                  "The blood is still fresh and shiny, dripping slightly from her chin down to her fingers."
                ],
                "creative_decisions": [
                  "Isolating the blood stains as the most vibrant element in the frame to emphasize her loss of control and the resulting visceral horror."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 63,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "c02b761424f372f7"
      },
      {
        "scene_index": 63,
        "heading": "실내. 반월 식당 - 밤",
        "beat_title": "자신의 손에 묻은 피를 보고 내지르는 비명",
        "representative_moment": "피로 범벅이 된 자신의 두 손을 보며 공포에 질려 비명을 지르는 찰나.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "frontal seated eye-level, heavy shadows with hard emotional contrast",
            "t2i_prompt": "Photorealistic cinematic still. Seen from a frontal seated eye-level camera, an East Asian woman in her 20s in a dark shirt is facing the camera, her terrified face dominating the center of the frame between both of her recoiling, suspended hands held aloft. Her hands occupy the lower side quadrants of the frame. Her mouth area and both of her hands are heavily covered and smeared with vivid, wet red blood, the deep crimson stains contrasting starkly against her bare skin. Her mouth is open in a scream, her gaze looking down at her suspended hands. The interior is enveloped in low-key, dim night illumination, creating a dark and restrained atmosphere. Heavy shadows hold her features in hard emotional contrast, emphasizing the vivid red blood as the sharpest color accent. Behind her, a wooden dining table falls into a soft, out-of-focus background.",
            "outfit_assignments": [],
            "source_facts": [
              "S64 action: '피로 흥건한 자기 손을 본다. 너무 놀라 터질 듯 눈이 커진다. 수리영: 으아아악!'",
              "shot description: frontal seated eye level camera, terrified face between both suspended, blood-covered hands, gaze=down"
            ],
            "visual_inferences": [
              "fixed_element jihoo_blood_stains: mouth area and both hands are heavily covered and smeared with vivid, wet red blood",
              "fixed_element restaurant_low_key_lighting: low-key, dim night illumination creating a dark and restrained atmosphere"
            ],
            "creative_decisions": [
              "soft out-of-focus background for the dining table to isolate her face and hands in the close frame",
              "hard emotional contrast with heavy shadows to make the red blood stand out aggressively against her skin"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "blood",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boarding gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hand",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passageway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "safety rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sea",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "cbcecaddad03ba3b",
              "owned_hash": "ffd873d8fb4f5c58",
              "camera_direction_hash": "943269203fa0b454",
              "owned_usage_hash": "0bb600e7e87a1f57",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 63,
        "dependency_reason": "동일 씬 내 이전 샷(Shot 8)의 조명 상태(restaurant_low_key_lighting)와 인물의 출혈 상태(jihoo_blood_stains) 연속성 유지",
        "_shot_index": 14,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 63,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Finish the frontal dolly-in at seated eye level on a close composition that holds 김지후(강수리영)'s terrified face between both suspended, blood-covered hands. Her hands occupy the lower side quadrants rather than hiding her expression, while the table falls soft behind her at the instant her scream breaks out.",
            "lighting_mood": "Low-key restaurant light holds her features in hard emotional contrast, with the explicitly red blood retained as the dominant accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L38B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_low_key_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the restaurant is enveloped in low-key, dim night illumination, creating a dark and restrained atmosphere. Heavy shadows dominate the space, serving to emphasize sharp contrasts and vivid accents like bright red without flooding the room with light.",
                "applies_to_shots": [
                  2,
                  8,
                  14
                ],
                "element_scope": "full",
                "source_facts": [
                  "Night illumination appropriate to the restaurant interior",
                  "Low-key restaurant lighting preserves the scene's restrained darkness",
                  "Low-key restaurant light holds her features in hard emotional contrast"
                ],
                "visual_inferences": [
                  "The light source is likely minimal overhead or faint ambient light, casting deep shadows in the corners of the room."
                ],
                "creative_decisions": [
                  "Utilizing a highly restricted color palette in the environment to make the blood and raw meat stand out aggressively against the darkness."
                ],
                "confidence": "high"
              },
              {
                "element_id": "jihoo_blood_stains",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Kim Ji-hoo (Kang Soo-ri-young)'s mouth area and both of her hands are heavily covered and smeared with vivid, wet red blood. The deep crimson stains contrast starkly against her bare skin, remaining a prominent and horrifying localized detail on her face and hands.",
                "applies_to_shots": [
                  8,
                  14
                ],
                "element_scope": "close",
                "source_facts": [
                  "입가로 붉은 피가 흘러내리지만",
                  "두 손도 피로 범벅이지만",
                  "피로 흥건한 자기 손을 본다",
                  "explicitly red raw meat and blood become the sharpest color accents",
                  "suspended, blood-covered hands"
                ],
                "visual_inferences": [
                  "The blood is still fresh and shiny, dripping slightly from her chin down to her fingers."
                ],
                "creative_decisions": [
                  "Isolating the blood stains as the most vibrant element in the frame to emphasize her loss of control and the resulting visceral horror."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 63,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "0bdf3cbce9ba9cd0"
      },
      {
        "scene_index": 64,
        "heading": "65. 실외. 금월도 숲속 - 밤",
        "beat_title": "거침없이 산길을 오르는 영란과 호위하는 마을 사람들",
        "representative_moment": "어두운 밤 숲길에서 거침없이 걷는 영란(C06)을 옆에서 따라가며 담은 넓은 프레임.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height wide tracking shot with high-contrast moonlit lighting",
            "t2i_prompt": "Photorealistic cinematic still. C06O08 in a deep red shaman robe, an elderly Korean woman with an elegant face, refined features, and neatly tied hair, appears in the middle-center midground, moving toward the uphill forest path in the middle-right background. Captured from a waist-height tracking position, C06O08 is seen in right profile, her full body framed head to toe, one lifted foot driving forward in a fast mid-stride, looking up. A group of Asian villagers in dark rural clothes, acting as an escort, walk closely behind her on the same shared path, seen at a three-quarter angle from the right, gazing into the distance. Moonlit night contrast silhouettes the surrounding pine tree trunks and shrubs along the edges, preserving the explicit deep red of the shaman robe against the darkness. The path stretches laterally across the wide frame.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "C06 in a red shaman robe walks up a dark forest path.",
              "Villagers escort C06 along the path.",
              "C06 strides forward with an unimpeded, fast step."
            ],
            "visual_inferences": [
              "Moonlit contrast lighting silhouetting the forest environment while highlighting the red robe.",
              "Waist-height parallel tracking composition framing the full body head to toe.",
              "Villagers positioned slightly behind on the same path to establish the escort dynamic."
            ],
            "creative_decisions": [
              "Positioned C06 in the center midground moving toward the right to emphasize lateral tracking motion.",
              "Applied a three-quarter angle to the villagers to show them trailing slightly behind C06 on the same path.",
              "Preserved the deep red color of the robe against the dark silhouettes of pine trees and shrubs for strong visual contrast."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "anchor",
                "source_phrase": "uphill forest path"
              },
              {
                "owned_token": "pine tree",
                "usage_kind": "anchor",
                "source_phrase": "surrounding pine tree trunks"
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "anchor",
                "source_phrase": "shrubs along the edges"
              },
              {
                "owned_token": "stone",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7651b8c7d4254412",
              "owned_hash": "1efe6162d8941574",
              "camera_direction_hash": "4b48ebe4154ad6de",
              "owned_usage_hash": "e473189199910fd0",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "path",
                  "violating_phrase": "uphill forest path",
                  "reason": "The prompt mentions the path as a compositional anchor for the characters' movement without dictating any redesign or recreation of the path, matching the producer's anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pine tree",
                  "violating_phrase": "surrounding pine tree trunks",
                  "reason": "The prompt uses the pine tree trunks as silhouetted edge elements for background atmosphere, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shrub",
                  "violating_phrase": "shrubs along the edges",
                  "reason": "The prompt references shrubs along the edges as silhouetted framing anchors, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 22,
        "dependency_reason": "previous_shot_refs indicates S22_Shot2 exact_background continuity",
        "_shot_index": 2,
        "visible_entities": [
          "C06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 64,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track parallel from beside the uphill path at waist height, framing 강영란(흰 머리 여자) head to toe in the middle of a wide image as her lifted foot drives forward. Match her pace for this single stride so her body stays stable while the path and escorting 금월도 마을 주민 slide laterally behind and around her.",
            "lighting_mood": "Moonlit night contrast silhouettes the forest edges while retaining the explicit deep red of 강영란(흰 머리 여자)'s shaman robe.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "uphill forest path",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "uphill forest path",
                  "label": "강영란(흰 머리 여자)",
                  "screen_zone": "middle_center",
                  "target_id": "C06",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "banner",
              "lantern",
              "path",
              "pine tree",
              "rope",
              "shrub",
              "stone"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 22,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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": "background",
                "id": "L18B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "368a68b3113a4096"
      },
      {
        "scene_index": 65,
        "heading": "66. 실외. 반월 식당 밖 - 밤",
        "beat_title": "급작스러운 화재 경보와 감시 이탈",
        "representative_moment": "화재 경보 소리에 화들짝 놀라 고개를 돌리는 C23 청년들.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "shared medium frame at eye level with cool night ambience",
            "t2i_prompt": "Photorealistic cinematic still. In a shared medium frame, C23O25 in a dark windbreaker, an Asian male youth with black hair and sun-weathered features, stands alongside another Asian youth in the dim alleyway, both their heads abruptly snapped toward the direction of the restaurant rear in the middle-right background. Seen from their front-side at eye level, their upper bodies are angled at three-quarter left with torsos beginning to twist, while their wide-eyed gazes are locked off-screen to the right in sudden alarm. Cool night ambience casts deep shadows across their tense shoulders and faces, freezing the split second before they sprint, as the restaurant's rough exterior wall stands silently behind them.",
            "outfit_assignments": [
              {
                "character_id": "C23",
                "outlook_id": "O25"
              }
            ],
            "source_facts": [
              "S66 action: '놀라서 소리나는 쪽을 보는 청년들. 후다닥 그쪽으로 뛰어들 간다.'",
              "shot description: youths turning heads abruptly to the rear of the restaurant upon hearing the alarm",
              "entity traits: C23 with black hair and sun-weathered features"
            ],
            "visual_inferences": [
              "dim alleyway setting based on night exterior",
              "torsos remaining angled three-quarter left while heads snap right to show abrupt reaction",
              "tense shoulders and wide-eyed gazes reflecting sudden alarm"
            ],
            "creative_decisions": [
              "shared medium frame at eye level to capture the synchronized reaction of the youths",
              "cool night ambience with deep shadows to emphasize the tension without adding unsupported light sources"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6ee6004a9c633c7c",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "f7f8ac96ccf19890",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 58,
        "dependency_reason": "반월 식당 밖 골목이라는 동일한 배경을 유지 (atmosphere_reference)",
        "_shot_index": 2,
        "visible_entities": [
          "C23"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 65,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the youths' front-side at eye level, whip the pan with their abrupt head turn and settle on a shared medium frame of their upper bodies. Their torsos still angle toward the restaurant while every head snaps toward the rear direction at frame right, capturing the split second before they break into a run.",
            "lighting_mood": "Night ambience appropriate to the exterior keeps the sudden synchronized head turn readable without specifying an unsupported light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "direction of the restaurant rear",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C23"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C23",
                "outlook_id": "O25"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 58,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C23O25",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "27cd4c7346c4f778"
      },
      {
        "scene_index": 66,
        "heading": "실외. 반월 식당 뒤뜰 - 밤",
        "beat_title": "불타는 창고와 혼란스러운 진화 작업",
        "representative_moment": "A wide view of the old storage building engulfed in towering flames while villagers desperately spray water from the yard.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level static view from the yard's outer edge, capturing scale and chaos",
            "t2i_prompt": "Photorealistic cinematic still. A burning storage building occupies the middle-center background, and a rear yard firefighting area spreads across the lower-center midground. Observed from the outer edge of the yard at eye level, the entire old storage shed sits centered, engulfed in towering flames rising through the upper frame. Several Korean villagers in workwear stand in the lower frame, facing away from the camera with eyes looking off-screen, bracing hoses toward the fierce blaze. A bucket and a timber pile rest nearby on the dirt. Thick black smoke billows into the night sky, partially obscuring the bright moon high above. Fierce red-orange firelight casts an intense glow across the yard, contrasting with the cool, dim moonlight filtering through the heavy smoke.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot description: towering flames over the old storage building in the rear yard.",
              "Villagers bracing hoses to extinguish the fire.",
              "Thick black smoke obscuring the bright night moon."
            ],
            "visual_inferences": [
              "The chaotic yard is illuminated primarily by the red-orange fire, creating deep shadows.",
              "Villagers are kept relatively small in the frame to establish scale."
            ],
            "creative_decisions": [
              "Anchored the bucket and timber pile in the yard to enrich the chaotic environment.",
              "Used the contrast between the violently warm firelight and the cool moonlight to heighten tension."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bucket",
                "usage_kind": "anchor",
                "source_phrase": "A bucket and a timber pile rest nearby"
              },
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "goat shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage shed",
                "usage_kind": "anchor",
                "source_phrase": "the entire old storage shed sits centered"
              },
              {
                "owned_token": "timber pile",
                "usage_kind": "anchor",
                "source_phrase": "A bucket and a timber pile rest nearby"
              },
              {
                "owned_token": "trough",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "cf39aab8e82f418b",
              "owned_hash": "aba12590c8be5549",
              "camera_direction_hash": "02234bf8cd48e37a",
              "owned_usage_hash": "7039f4e233086c70",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "storage_shed",
                  "violating_phrase": "the entire old storage shed sits centered, engulfed in towering flames",
                  "reason": "The storage shed is depicted as being engulfed in flames, which is a visual state change structurally required by the shot intent ('old storage building engulfed in towering flames').",
                  "verdict": "allowed_visual_state_change"
                },
                {
                  "owned_object": "bucket",
                  "violating_phrase": "A bucket ... rest nearby on the dirt",
                  "reason": "The bucket is mentioned as resting on the dirt as an existing passive prop, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "timber pile",
                  "violating_phrase": "a timber pile rest nearby on the dirt",
                  "reason": "The timber pile is described as resting nearby as a static environment anchor, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No prior dependent scene provided.",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 66,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the outer edge of the rear yard at eye level, hold a static wide view with the entire old storage building centered and the surrounding yard visible on all sides. Towering flames rise through the upper middle of the frame while firefighting residents remain small enough in the yard to establish the scale and disorder without displacing the burning structure as the primary subject.",
            "lighting_mood": "The explicitly towering fire casts a fierce red-orange illumination across the night yard, opposed by the bright moon as smoke increasingly veils it.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "burning storage building",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "rear yard firefighting area",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L53B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bucket",
              "fence",
              "gate",
              "goat shed",
              "lamp",
              "storage shed",
              "timber pile",
              "trough",
              "utility pole"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L53B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "0655a0fcd5130a69"
      },
      {
        "scene_index": 67,
        "heading": "실외. 숲길 - 밤",
        "beat_title": "플래시 불빛에 놀란 수리영",
        "representative_moment": "Suri-young flinches and squints her eyes as a sudden, harsh flashlight beam strikes her face on the dark uphill path.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "frontal tight close frame at eye level, stark high-contrast low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. An Asian young woman in a dark jacket, facing the camera, flinching mid uphill step. She is framed in a tight close-up at eye level, her shoulders angled by the steep climb, her face squinting and eyes nearly squeezed shut as she looks toward an off-screen figure. Her exposed bare neck conspicuously lacks a necklace, the skin showing visible sweat and deep exhaustion. A sudden, harsh directional beam from an off-screen flashlight cuts intensely across her face from the front, creating a stark, high-contrast, low-key illumination against the dim ambient moonlight. A narrow, soft out-of-focus strip of a dark dirt path and shadowy foliage borders the background edge.",
            "outfit_assignments": [],
            "source_facts": [
              "달빛 아래 헉헉대며 숲길을 올라가는 수리영",
              "갑작스레 얼굴에 쏟아지는 불빛에 놀란 수리영이 인우를 본다",
              "목걸이 잃어버렸어?",
              "camera_direction: isolating her face in a tight close frame as the sudden flashlight beam makes her flinch and squeeze her eyes nearly shut"
            ],
            "visual_inferences": [
              "fixed_element suri_young_bare_neck_detail: deep physical exertion and sweat on her bare neck",
              "fixed_element harsh_flashlight_illumination: stark, low-key, high-contrast illumination on the face",
              "fixed_element moonlit_forest_path: narrow soft background strip of uphill path behind her"
            ],
            "creative_decisions": [
              "Isolated the subject in a tight close-up to emphasize the sudden shock of the flashlight and the bareness of her neck.",
              "Used high-contrast directional lighting to separate her startled expression from the extremely dark, out-of-focus forest background."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pine tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "root",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "de5652e8a38414a9",
              "owned_hash": "20378b483cd3c823",
              "camera_direction_hash": "10052077a2f58597",
              "owned_usage_hash": "8465e7af3168a7b2",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 38,
        "dependency_reason": "location continuity (moonlit forest path and dark surroundings established in previous scene)",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 67,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Finish the frontal dolly-in directly before 김지후(강수리영) at her eye level, isolating her face in a tight close frame as the sudden flashlight beam makes her flinch and squeeze her eyes nearly shut. Her shoulders remain angled by the uphill motion and a narrow strip of the path survives behind her, preventing the reaction from reading as a detached portrait.",
            "lighting_mood": "A sudden frontal flashlight beam cuts harshly across her face against the explicitly moonlit night path, producing a startled high-contrast close-up.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L23B06",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "moonlit_forest_path",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene is set on an uphill dirt path within a dark forest at night. Ambient moonlight provides a dim, natural base illumination, outlining the dense, shadowy woods flanking the trail.",
                "applies_to_shots": [
                  3,
                  8,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲길 - 밤",
                  "달빛 아래 헉헉대며 숲길을 올라가는",
                  "explicitly moonlit night path",
                  "uphill forest path receding behind her"
                ],
                "visual_inferences": [
                  "The terrain is rugged and steep, heavily surrounded by unlit trees and foliage typical of an isolated wilderness."
                ],
                "creative_decisions": [
                  "Maintained a consistently dark and shadowy background to emphasize the isolation and eerie atmosphere of the island."
                ],
                "confidence": "high"
              },
              {
                "element_id": "harsh_flashlight_illumination",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A bright, directional beam from a handheld flashlight cuts intensely through the dark environment. This active lighting creates a stark, high-contrast, and low-key illumination on the subjects against the night surroundings.",
                "applies_to_shots": [
                  3,
                  8,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "인우가 백팩에서 플래쉬 라이트를 꺼내서 켠다.",
                  "갑작스레 얼굴에 쏟아지는 불빛",
                  "A sudden frontal flashlight beam cuts harshly",
                  "active flashlight create low-key, high-contrast illumination"
                ],
                "visual_inferences": [
                  "The sudden introduction of the flashlight creates sharp, dramatic shadows on the characters' faces and the immediate foreground."
                ],
                "creative_decisions": [
                  "Used the harsh flashlight beam as a practical light source to spotlight the subjects' expressions and draw attention away from the dark background."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suri_young_bare_neck_detail",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Her neck is completely bare, conspicuously missing the necklace she previously wore. The skin around her face and neckline shows signs of deep physical exertion and exhaustion from climbing the steep path.",
                "applies_to_shots": [
                  3,
                  8
                ],
                "element_scope": "close",
                "source_facts": [
                  "목걸이 잃어버렸어?",
                  "섬에 들어올 땐 분명 하고 있었는데…",
                  "hand pressed to her bare neck",
                  "isolating her face in a tight close frame",
                  "헉헉대며 숲길을 올라가는 수리영"
                ],
                "visual_inferences": [
                  "Because the camera frames her face and upper torso tightly, the absence of the necklace on her exposed neck is visually prominent."
                ],
                "creative_decisions": [
                  "Consistently showcased her empty neckline in tighter shots to visually anchor her sense of loss and physical vulnerability."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 38,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "c583b0ac30f531ef"
      },
      {
        "scene_index": 67,
        "heading": "68. 실외. 숲길 - 밤",
        "beat_title": "목걸이 분실과 기이한 변화 자각",
        "representative_moment": "텅 빈 자신의 목덜미에 손을 얹고 불안한 눈빛으로 시선을 던지는 수리영의 찰나.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tracking parallel at upper-torso height, harsh flashlight over moonlit ambient, low-key and high-contrast",
            "t2i_prompt": "Photorealistic cinematic still. At upper-torso height tracking parallel beside the figure, her anxious eyes occupy the upper third of the frame and the hand pressed to her bare neck occupies the lower third. An East Asian young woman in a dark outdoor jacket is captured mid-stride at three-quarter angle from the left on an uphill dirt path, looking off-screen. Her neck is completely exposed, the skin showing signs of physical exertion. A harsh, directional flashlight beam creates low-key, high-contrast illumination across her face and neck. The path and shadowy pine tree trunks of the dark forest recede behind her, dimly outlined by ambient moonlight.",
            "outfit_assignments": [],
            "source_facts": [
              "달빛 아래 헉헉대며 숲길을 올라가는 수리영",
              "목걸이 잃어버렸어? 어쩌다? / 몰라. 그냥 없어졌어.",
              "갑작스레 얼굴에 쏟아지는 불빛"
            ],
            "visual_inferences": [
              "fixed_element moonlit_forest_path: uphill path receding behind her",
              "fixed_element harsh_flashlight_illumination: stark active lighting creating deep shadows",
              "fixed_element suri_young_bare_neck_detail: skin shows physical exertion, absent necklace"
            ],
            "creative_decisions": [
              "Placed her eyes and bare neck strictly in the upper and lower thirds to align with the camera direction intent.",
              "Used mid-stride posing with three-quarter angle to preserve the lateral movement and urgency of the scene."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "anchor",
                "source_phrase": "on an uphill dirt path"
              },
              {
                "owned_token": "pine tree",
                "usage_kind": "anchor",
                "source_phrase": "shadowy pine tree trunks"
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "root",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "bdc1769e07dd6c12",
              "owned_hash": "20378b483cd3c823",
              "camera_direction_hash": "107c6ca076200305",
              "owned_usage_hash": "3ff8fe8b3d250b3e",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "path",
                  "violating_phrase": "on an uphill dirt path",
                  "reason": "The path is referenced as a spatial anchor for the character's movement and background composition, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pine tree",
                  "violating_phrase": "shadowy pine tree trunks",
                  "reason": "The pine tree trunks are mentioned as part of the background environment receding behind the character, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 67,
        "dependency_reason": "Uses the same moonlit forest path background and lighting state established in the prior exact_background reference shot.",
        "_shot_index": 8,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 67,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track parallel at upper-torso height beside 김지후(강수리영), then dip just enough to hold her anxious eyes in the upper third and the hand pressed to her bare neck in the lower third. Keep her in a three-quarter view with the uphill forest path receding behind her, preserving the lateral movement established by the scene flow.",
            "lighting_mood": "Moonlight and the active flashlight create low-key, high-contrast illumination that intermittently catches her eyes and empty neck.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "fence",
              "gate",
              "path",
              "pine tree",
              "rock",
              "root",
              "shrub"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "moonlit_forest_path",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene is set on an uphill dirt path within a dark forest at night. Ambient moonlight provides a dim, natural base illumination, outlining the dense, shadowy woods flanking the trail.",
                "applies_to_shots": [
                  3,
                  8,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲길 - 밤",
                  "달빛 아래 헉헉대며 숲길을 올라가는",
                  "explicitly moonlit night path",
                  "uphill forest path receding behind her"
                ],
                "visual_inferences": [
                  "The terrain is rugged and steep, heavily surrounded by unlit trees and foliage typical of an isolated wilderness."
                ],
                "creative_decisions": [
                  "Maintained a consistently dark and shadowy background to emphasize the isolation and eerie atmosphere of the island."
                ],
                "confidence": "high"
              },
              {
                "element_id": "harsh_flashlight_illumination",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A bright, directional beam from a handheld flashlight cuts intensely through the dark environment. This active lighting creates a stark, high-contrast, and low-key illumination on the subjects against the night surroundings.",
                "applies_to_shots": [
                  3,
                  8,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "인우가 백팩에서 플래쉬 라이트를 꺼내서 켠다.",
                  "갑작스레 얼굴에 쏟아지는 불빛",
                  "A sudden frontal flashlight beam cuts harshly",
                  "active flashlight create low-key, high-contrast illumination"
                ],
                "visual_inferences": [
                  "The sudden introduction of the flashlight creates sharp, dramatic shadows on the characters' faces and the immediate foreground."
                ],
                "creative_decisions": [
                  "Used the harsh flashlight beam as a practical light source to spotlight the subjects' expressions and draw attention away from the dark background."
                ],
                "confidence": "high"
              },
              {
                "element_id": "suri_young_bare_neck_detail",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Her neck is completely bare, conspicuously missing the necklace she previously wore. The skin around her face and neckline shows signs of deep physical exertion and exhaustion from climbing the steep path.",
                "applies_to_shots": [
                  3,
                  8
                ],
                "element_scope": "close",
                "source_facts": [
                  "목걸이 잃어버렸어?",
                  "섬에 들어올 땐 분명 하고 있었는데…",
                  "hand pressed to her bare neck",
                  "isolating her face in a tight close frame",
                  "헉헉대며 숲길을 올라가는 수리영"
                ],
                "visual_inferences": [
                  "Because the camera frames her face and upper torso tightly, the absence of the necklace on her exposed neck is visually prominent."
                ],
                "creative_decisions": [
                  "Consistently showcased her empty neckline in tighter shots to visually anchor her sense of loss and physical vulnerability."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 67,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L23B06",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "1c33a14868b2d85a"
      },
      {
        "scene_index": 67,
        "heading": "68. 실외. 숲길 - 밤",
        "beat_title": "낯선 섬과 자신들에 대한 자각과 멈춤",
        "representative_moment": "어두운 숲길 오르막에서 두 남녀가 거리를 두고 마주 선 채 굳은 표정으로 서로를 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide full-body composition at chest height, high-contrast flashlight beam against dim ambient moonlight",
            "t2i_prompt": "Photorealistic cinematic still. A wide full-body composition at chest height, capturing two figures separated across the center of a shared uphill dirt path. An Asian man stands on the left in right profile, feet firmly planted, holding a handheld flashlight, his eyes fixed on the woman across the path. On the right, an Asian woman stands in left profile, her shoulders tense, her eyes fixed on the man. A bright, directional beam from the flashlight cuts intensely through the dark space between them, creating stark, high-contrast illumination on their hardened faces. The surrounding dark forest is lit by dim ambient moonlight, with a large pine tree, exposed roots, and dense shrubs receding uphill behind the pair, outlining the isolated night trail.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: 어두운 숲길에서 심각한 표정으로 우뚝 멈춰 선 두 사람이 굳은 얼굴로 서로를 마주 보는 전경",
              "character staging: both figures stop, separated across the center of the path",
              "character states: In-woo profile_right, feet planted; Soo-ri-young profile_left, shoulders tense"
            ],
            "visual_inferences": [
              "fixed_element moonlit_forest_path: uphill dirt path within a dark forest at night, outlined by ambient moonlight",
              "fixed_element harsh_flashlight_illumination: bright directional beam creates stark shadows on their faces",
              "shared spatial anchor (uphill dirt path) clearly connects the fg/bg separated figures in the wide framing"
            ],
            "creative_decisions": [
              "chest-height camera to capture full bodies without geometrically violating the ground placement",
              "emphasized the rigid side profiles and empty space between them to highlight the tension and confrontation"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "anchor",
                "source_phrase": "a shared uphill dirt path"
              },
              {
                "owned_token": "pine tree",
                "usage_kind": "anchor",
                "source_phrase": "a large pine tree"
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "root",
                "usage_kind": "anchor",
                "source_phrase": "exposed roots"
              },
              {
                "owned_token": "shrub",
                "usage_kind": "anchor",
                "source_phrase": "dense shrubs"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c34d323263e55b74",
              "owned_hash": "20378b483cd3c823",
              "camera_direction_hash": "d177a18488c2cee7",
              "owned_usage_hash": "6477ac029894a8d4",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "path",
                  "violating_phrase": "a shared uphill dirt path",
                  "reason": "The prompt mentions the path as a spatial anchor for the characters to stand on, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pine tree",
                  "violating_phrase": "a large pine tree",
                  "reason": "The prompt mentions the pine tree as receding in the background to set the dark forest scene, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "root",
                  "violating_phrase": "exposed roots",
                  "reason": "The prompt refers to the exposed roots in the background as part of the surrounding forest scene, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "shrub",
                  "violating_phrase": "dense shrubs",
                  "reason": "The prompt references dense shrubs receding uphill behind the pair to outline the trail, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 67,
        "dependency_reason": "직전 샷(Shot 8)의 동일한 숲길 환경을 exact_background로 유지하면서 인물들의 멈춰선 정지 순간을 일관성 있게 묘사하기 위함.",
        "_shot_index": 9,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 67,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the downhill dolly-out at chest height only after both figures stop, resolving into a wide full-body composition with 김지후(강수리영) and 정인우 separated across the center of the path. Hold the camera level and let their rigid profiles and the empty space between them carry the confrontation.",
            "lighting_mood": "Moonlight and the carried flashlight maintain a restrained, high-contrast night image with both hardened faces remaining legible.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "fence",
              "gate",
              "path",
              "pine tree",
              "rock",
              "root",
              "shrub"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "moonlit_forest_path",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene is set on an uphill dirt path within a dark forest at night. Ambient moonlight provides a dim, natural base illumination, outlining the dense, shadowy woods flanking the trail.",
                "applies_to_shots": [
                  3,
                  8,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 숲길 - 밤",
                  "달빛 아래 헉헉대며 숲길을 올라가는",
                  "explicitly moonlit night path",
                  "uphill forest path receding behind her"
                ],
                "visual_inferences": [
                  "The terrain is rugged and steep, heavily surrounded by unlit trees and foliage typical of an isolated wilderness."
                ],
                "creative_decisions": [
                  "Maintained a consistently dark and shadowy background to emphasize the isolation and eerie atmosphere of the island."
                ],
                "confidence": "high"
              },
              {
                "element_id": "harsh_flashlight_illumination",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A bright, directional beam from a handheld flashlight cuts intensely through the dark environment. This active lighting creates a stark, high-contrast, and low-key illumination on the subjects against the night surroundings.",
                "applies_to_shots": [
                  3,
                  8,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "인우가 백팩에서 플래쉬 라이트를 꺼내서 켠다.",
                  "갑작스레 얼굴에 쏟아지는 불빛",
                  "A sudden frontal flashlight beam cuts harshly",
                  "active flashlight create low-key, high-contrast illumination"
                ],
                "visual_inferences": [
                  "The sudden introduction of the flashlight creates sharp, dramatic shadows on the characters' faces and the immediate foreground."
                ],
                "creative_decisions": [
                  "Used the harsh flashlight beam as a practical light source to spotlight the subjects' expressions and draw attention away from the dark background."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 67,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L23B06",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "91d2c2aa7019d65f"
      },
      {
        "scene_index": 68,
        "heading": "69. 실외. 숲속 만월제 도당 - 밤",
        "beat_title": "제단을 향한 기도",
        "representative_moment": "강영란이 거대한 바위 제단 앞에서 불타는 모닥불 원진 안쪽에 무릎을 꿇고 있는 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide shot from behind at eye level, low-key high-contrast firelight illuminating the smoke",
            "t2i_prompt": "Photorealistic cinematic still. An older Asian woman with distinct white hair in traditional Korean shamanic ritual clothing maintains a fixed kneeling posture in the lower-center foreground with her back to the camera, her gaze fixed on the large rock and altar in the upper-center background. [L20: A dark night forest clearing serves as a ritual site, featuring multiple bonfires arranged in a wide circular formation around the space. Thick, pale smoke drifts heavily through the air, shrouding the dark trees.] The low, high-contrast firelight cuts through the misty smoke, shaping the silhouette of the kneeling figure and the enormous rock against the deep night.",
            "outfit_assignments": [],
            "source_facts": [
              "무녀복 차림 영란이 바위 앞에 꿇어앉아",
              "모닥불 여러 개가 둥그런 원을 그리며 활활 타오르는 가운데",
              "희뿌연 안개처럼 주변을 감싼 연기가 신령스러운 느낌과 포스를 바위에 더한다"
            ],
            "visual_inferences": [
              "fixed_element kang_young_ran_kneeling_posture: fixed kneeling posture facing the altar from behind",
              "fixed_element forest_shrine_environment: dark night forest with low-key firelight and thick smoke",
              "The bonfires create a glowing circular boundary that isolates the ritual space"
            ],
            "creative_decisions": [
              "Placed the woman in the lower-center foreground with her back to the camera to anchor the composition and emphasize the massive rock altar in the upper-center background.",
              "Used high-contrast firelight piercing through thick smoke to enhance the solemn and occult thriller mood without revealing facial details."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a3c888235a829e97",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "211c109b91252aaf",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 58,
        "dependency_reason": "이전 샷의 숲속 밤 분위기 및 조명 톤과의 연속성 유지",
        "_shot_index": 1,
        "visible_entities": [
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 68,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Begin at standing eye level several meters behind 강영란(흰 머리 여자), centered on the axis connecting her kneeling back to the enormous rock, and start a restrained dolly forward from outside the ring of fires. Keep her full kneeling figure low in the central frame while the rock and circular ritual layout remain clearly readable beyond her.",
            "lighting_mood": "The surrounding bonfires provide low, high-contrast firelight through the pale smoke, shaping the kneeling figure and rock against the night.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "large rock and altar",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "L20"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "forest_shrine_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark night forest clearing featuring a giant, imposing rock that serves as a central altar. Multiple bonfires burn brightly, arranged in a wide circular formation around the space. Thick, pale smoke drifts heavily through the air, reflecting the low-key, high-contrast firelight and shrouding the dark trees in the background.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "모닥불 여러 개가 둥그런 원을 그리며 활활 타오르는 가운데",
                  "희뿌연 안개처럼 주변을 감싼 연기",
                  "바위 앞 제단",
                  "surrounding bonfires provide low, high-contrast firelight through the pale smoke"
                ],
                "visual_inferences": [
                  "The ground is a natural forest floor composed of dirt and subtle vegetation, suitable for an ancient ritual setting.",
                  "The heavy smoke creates a thick misty wall that obscures the deeper parts of the forest."
                ],
                "creative_decisions": [
                  "Using the circular layout of the bonfires to symmetrically frame the rock altar, isolating the spiritual space from the ordinary world."
                ],
                "confidence": "high"
              },
              {
                "element_id": "kang_young_ran_kneeling_posture",
                "element_type": "character_state",
                "character_name": "Kang Young-ran",
                "description": "Kang Young-ran is an older woman with distinct white hair. She is dressed in traditional Korean shamanic ritual clothing. She maintains a fixed kneeling posture on the ground directly facing the giant rock altar, serving as the central figure of the ritual site.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "무녀복 차림 영란이 바위 앞에 꿇어앉아",
                  "흰 머리 여자",
                  "full kneeling figure low in the central frame",
                  "kneeling torso retained as scale reference"
                ],
                "visual_inferences": [
                  "Her traditional shamanic clothing features classical cuts and fabrics that contrast against the dark, smoky night environment.",
                  "Her posture is rigidly planted on the ground to emphasize the solemn nature of the invocation."
                ],
                "creative_decisions": [
                  "Keeping her base kneeling stance entirely stationary to anchor her visual presence, even when she moves her arms or head."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 58,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "7f86236acdea4efe"
      },
      {
        "scene_index": 68,
        "heading": "69. 실외. 숲속 만월제 도당 - 밤",
        "beat_title": "허공에 치켜든 목걸이",
        "representative_moment": "강영란이 무녀복 차림으로 꿇어앉아 짐승 뼈 모양의 목걸이를 허공으로 높이 치켜들고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tall medium frame from kneeling head height, low-key high-contrast bonfire lighting",
            "t2i_prompt": "Photorealistic cinematic still. Captured at kneeling head height from a front-side quarter angle looking slightly upward, a tall medium frame centers on an older Asian woman with distinct white hair. She is dressed in traditional Korean shamanic ritual clothing. Seen at three-quarter angle from the right, she maintains a fixed kneeling posture, her arm extended to hold an animal-bone-shaped necklace high in the air. Her eyes are fixed on the necklace. Her lifted hand and the bone necklace occupy the upper frame, while her kneeling torso remains visible in the lower frame as a scale reference. Behind her, a dark night forest clearing features a giant, imposing rock serving as a central altar. Multiple bonfires burn brightly in a wide circular formation around the space. Thick, pale smoke drifts heavily, reflecting the low-key, high-contrast firelight that catches the raised bone necklace and the fabric planes of her ritual clothing, shrouding the dark trees in the background.",
            "outfit_assignments": [],
            "source_facts": [
              "무녀복 차림 영란이 바위 앞에 꿇어앉아",
              "품에서 무언가를 꺼내 바위 앞 제단에 올려놓는다. 바로 수리영이 잃어버렸다던... 그 목걸이.",
              "Shot description: 강영란(흰 머리 여자)이 품속에서 꺼낸 짐승 뼈 모양의 목걸이를 허공으로 높이 치켜든 찰나"
            ],
            "visual_inferences": [
              "fixed_element kang_young_ran_kneeling_posture: older woman with distinct white hair maintaining a fixed kneeling posture",
              "fixed_element forest_shrine_environment: dark night forest clearing, giant rock altar, bonfires in a circular formation, thick pale smoke"
            ],
            "creative_decisions": [
              "Used a tall medium frame from a slightly low angle looking upward to highlight the raised necklace while anchoring her kneeling torso in the lower frame for scale.",
              "Applied low-key, high-contrast firelight cutting through pale smoke to emphasize the mystical and ominous ritual atmosphere."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5d96a03a0f02d323",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "bc9f5960752d59e4",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 58,
        "dependency_reason": "이전 만월제 준비 씬(58씬)과 동일한 숲속 도당 제단과 주변 모닥불 공간의 시각적 연속성 유지",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 68,
            "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 강영란(흰 머리 여자)'s front-side quarter at her kneeling head height, tilt upward along her extended arm and settle on the raised animal-bone-shaped necklace. Use a tall medium frame so her lifted hand and the complete necklace remain above her intent three-quarter face, with part of her kneeling torso retained as scale reference.",
            "lighting_mood": "Bonfire light cuts through the pale smoke in low-key contrast, catching the raised necklace and the planes of her ritual clothing.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "forest_shrine_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark night forest clearing featuring a giant, imposing rock that serves as a central altar. Multiple bonfires burn brightly, arranged in a wide circular formation around the space. Thick, pale smoke drifts heavily through the air, reflecting the low-key, high-contrast firelight and shrouding the dark trees in the background.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "모닥불 여러 개가 둥그런 원을 그리며 활활 타오르는 가운데",
                  "희뿌연 안개처럼 주변을 감싼 연기",
                  "바위 앞 제단",
                  "surrounding bonfires provide low, high-contrast firelight through the pale smoke"
                ],
                "visual_inferences": [
                  "The ground is a natural forest floor composed of dirt and subtle vegetation, suitable for an ancient ritual setting.",
                  "The heavy smoke creates a thick misty wall that obscures the deeper parts of the forest."
                ],
                "creative_decisions": [
                  "Using the circular layout of the bonfires to symmetrically frame the rock altar, isolating the spiritual space from the ordinary world."
                ],
                "confidence": "high"
              },
              {
                "element_id": "kang_young_ran_kneeling_posture",
                "element_type": "character_state",
                "character_name": "Kang Young-ran",
                "description": "Kang Young-ran is an older woman with distinct white hair. She is dressed in traditional Korean shamanic ritual clothing. She maintains a fixed kneeling posture on the ground directly facing the giant rock altar, serving as the central figure of the ritual site.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "무녀복 차림 영란이 바위 앞에 꿇어앉아",
                  "흰 머리 여자",
                  "full kneeling figure low in the central frame",
                  "kneeling torso retained as scale reference"
                ],
                "visual_inferences": [
                  "Her traditional shamanic clothing features classical cuts and fabrics that contrast against the dark, smoky night environment.",
                  "Her posture is rigidly planted on the ground to emphasize the solemn nature of the invocation."
                ],
                "creative_decisions": [
                  "Keeping her base kneeling stance entirely stationary to anchor her visual presence, even when she moves her arms or head."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 58,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "3d9ecc0ad5061485"
      },
      {
        "scene_index": 68,
        "heading": "69. 실외. 숲속 만월제 도당 - 밤",
        "beat_title": "귀신을 부르는 휘파람",
        "representative_moment": "흰 머리의 무녀가 무릎을 꿇고 턱을 치켜든 채 밤하늘을 향해 날카롭게 휘파람을 불고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "slightly low angle close framing on the face, high-contrast bonfire illumination",
            "t2i_prompt": "Photorealistic cinematic still. An elderly Korean woman with white hair in a traditional ritual robe, kneeling at a three-quarter angle from the left. Captured from a slightly low angle angled upward toward her mouth, framing her eyes, nose, lifted chin, and tightly pursed lips blowing a whistle into the air, looking up. Low, high-contrast bonfire illumination models her lifted face through drifting pale smoke against a soft, subdued dark night background.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: 강영란(흰 머리 여자)이 입술을 뾰족하게 오므리고 허공을 향해 날카롭게 휘파람을 부는 얼굴 클로즈업",
              "S69 action: 영란이 무릎을 꿇고 치성을 올리다 밤하늘에 휘파람을 붊",
              "shot staging: three_quarter_left, chin lifted while kneeling, gaze=up, state=alive"
            ],
            "visual_inferences": [
              "slightly low angle emphasizing the invocation gesture",
              "high-contrast bonfire light reflecting on the lifted face",
              "pale smoke adding ritual atmosphere without obscuring features"
            ],
            "creative_decisions": [
              "close framing on the face and pursed lips to capture the sharp whistle action",
              "subdued night background to isolate the character's expression and match the skipped close framing rule"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "eaf4f3c54ed6eb53",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "fe72811003df6b33",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 68,
        "dependency_reason": "maintains the same ritual location and bonfire lighting from the previous shots within the scene",
        "_shot_index": 7,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 68,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Finish the dolly-in at face height on 강영란(흰 머리 여자)'s front-side quarter, framing her eyes, nose, lifted chin, and pursed lips without crossing into an extreme close-up. Angle slightly upward toward her mouth so the whistle reads as an invocation rather than a conventional frontal portrait.",
            "lighting_mood": "Low, high-contrast bonfire illumination models her lifted face through the pale smoke while keeping the night background subdued.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 68,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "e23b362fd75065e7"
      },
      {
        "scene_index": 69,
        "heading": "다시 숲속 - 밤",
        "beat_title": "충격적인 진실의 깨달음",
        "representative_moment": "정인우가 식인의 진실을 깨닫고 경악하며 어두운 숲길 한가운데 우뚝 멈춰 서 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Wide waist-height observer angle, unstable low-key flashlight illumination with deep forest shadows.",
            "t2i_prompt": "Photorealistic cinematic still. A wide waist-height observer perspective, the unpaved dirt path occupying the lower frame and upper branches reaching into the top edge. At the center of the path, an East Asian man in his 30s in a casual dark jacket stands fully visible. He is seen at a three-quarter angle from the right, frozen with knees braced as if abruptly halting his forward movement, his eyes looking off-screen. In his hand, a flashlight points low and away from the camera. The environment is a pitch-dark pine forest at night. Thick pine tree trunks stand densely alongside the path, facing the camera obliquely on both sides, surrounded by low, tangled vegetation. Faint, hazy smoke drifts across the night sky visible through the upper canopy. The active flashlight supplies unstable low-key illumination across the ground, leaving the man's shocked posture in sharp contrast against the deep shadows and very faint ambient night light.",
            "outfit_assignments": [],
            "source_facts": [
              "갑자기 뜨악- 하며 멈춰서는 인우.",
              "해송 나무 숲 사이로 보이는 밤하늘에 희뿌연 연기가 지나간다.",
              "여전히 흔들리는 플래쉬 불빛 하나에만 의존해 바쁘게 숲을 헤치며 앞으로 나아가는"
            ],
            "visual_inferences": [
              "wide waist-height perspective isolating the full body at the center of the path",
              "thick pine trunks framing the path obliquely",
              "flashlight pointing low to create sharp contrasting shadows on the lower body and ground",
              "nighttime_pine_forest element maintained for continuity"
            ],
            "creative_decisions": [
              "Placed the man at the absolute center of the wide frame to emphasize his isolation and sudden physical rupture in the search.",
              "Used deep, contrasting shadows among the trees to amplify the eerie, dangerous atmosphere of the island night."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5e9ec4d0ab6e26b8",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "8f11239e7463f6d3",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 53,
        "dependency_reason": "동일한 해송 숲속 배경이며, 시간대와 숲의 스산한 환경 상태(nighttime_pine_forest)의 연속성을 유지해야 함.",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 69,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Hold static at waist height several meters in front of 정인우, isolating his full body at the center of the forest path at the instant his forward movement stops. Keep the flashlight lowered within his silhouette and leave open path space around him so his realization reads as a physical rupture in the search.",
            "lighting_mood": "The active flashlight supplies unstable low-key illumination within the otherwise dark forest, leaving 정인우's shocked posture in sharp contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "nighttime_pine_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pitch-dark pine forest at night, with faint, hazy smoke drifting across the sky visible through the upper branches. Thick pine tree trunks stand densely alongside an unpaved dirt path, surrounded by low, tangled vegetation. The environment is heavily shadowed and illuminated only by very faint ambient night light.",
                "applies_to_shots": [
                  4,
                  9,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "해송 나무 숲",
                  "밤하늘에 희뿌연 연기가 지나간다",
                  "어두운 수풀 뒤",
                  "very low ambient night illumination"
                ],
                "visual_inferences": [
                  "The ground is uneven and covered with natural forest debris like fallen pine needles and dirt.",
                  "The low vegetation is dense enough to conceal people lying flat on the ground."
                ],
                "creative_decisions": [
                  "Maintain deep, contrasting shadows among the trees to emphasize the eerie, dangerous, and isolated atmosphere of the island."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 53,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "7c9e224364f55732"
      },
      {
        "scene_index": 69,
        "heading": "다시 숲속 - 밤",
        "beat_title": "마을 청년들을 피해 수풀에 엎드림",
        "representative_moment": "불 꺼진 손전등을 쥔 채 수풀 뒤에 납작 엎드린 두 남녀.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static ground-level hold behind vegetation, subdued ambient night illumination",
            "t2i_prompt": "Photorealistic cinematic still. Low concealing vegetation dominates the middle-center foreground as a broken frame. Just behind it, an East Asian young woman and an East Asian young man lie prone on the uneven dirt, pressed flat side by side. The woman is in right profile, gazing off-screen toward the unseen dirt path. The man is seen over the shoulder, pressed flat against the ground, his eyes fixed off-screen, one hand holding an unlit flashlight with its lamp end turned away from the path. Subdued ambient night illumination barely separates their tense faces from the tangled dark leaves. The pitch-dark pine forest surrounds them, featuring thick tree trunks densely packed under faint, hazy smoke drifting through the upper branches.",
            "outfit_assignments": [],
            "source_facts": [
              "S69 action: '반사적으로 플래쉬 불을 끄는 인우, 그리고 수리영. 둘 다 숲풀 뒤로 납작 엎드린다.'",
              "shot description: 불이 꺼진 어두운 수풀 뒤로 김지후와 정인우가 바닥에 납작하게 엎드려 숨을 죽인 상태"
            ],
            "visual_inferences": [
              "fixed_element nighttime_pine_forest: thick pine trunks, hazy smoke in upper branches",
              "ground-level perspective emphasizing their concealment behind the vegetation"
            ],
            "creative_decisions": [
              "Subdued low-key lighting to blend the characters with the dark environment, amplifying the tension of hiding",
              "Using the middle-center foreground vegetation as a broken frame to establish the POV of a concealed observer"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "4fcfb3bbe5fa4b67",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "8d84798f6fc9be6c",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 69,
        "dependency_reason": "exact_background from S69_Shot4 (nighttime_pine_forest environment)",
        "_shot_index": 9,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 69,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Settle into a static ground-level hold behind the low vegetation, close enough to frame 김지후(강수리영) and 정인우 lying flat side by side without exposing their bodies above cover. Use the vegetation as a broken foreground frame while both faces remain in shallow profile, directed toward the unseen activity beyond the path.",
            "lighting_mood": "With the flashlight switched off, subdued ambient night illumination leaves the concealed faces barely separated from the dark vegetation.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "low concealing vegetation",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "nighttime_pine_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pitch-dark pine forest at night, with faint, hazy smoke drifting across the sky visible through the upper branches. Thick pine tree trunks stand densely alongside an unpaved dirt path, surrounded by low, tangled vegetation. The environment is heavily shadowed and illuminated only by very faint ambient night light.",
                "applies_to_shots": [
                  4,
                  9,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "해송 나무 숲",
                  "밤하늘에 희뿌연 연기가 지나간다",
                  "어두운 수풀 뒤",
                  "very low ambient night illumination"
                ],
                "visual_inferences": [
                  "The ground is uneven and covered with natural forest debris like fallen pine needles and dirt.",
                  "The low vegetation is dense enough to conceal people lying flat on the ground."
                ],
                "creative_decisions": [
                  "Maintain deep, contrasting shadows among the trees to emphasize the eerie, dangerous, and isolated atmosphere of the island."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 69,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "93f7784e74528b5c"
      },
      {
        "scene_index": 69,
        "heading": "70. 다시 숲속 - 밤",
        "beat_title": "어둠 속을 내달리는 마을 청년들의 실루엣",
        "representative_moment": "어두운 숲길, 등불 하나 없이 기괴한 모습으로 산을 내려가는 마을 청년들(C23)의 모습을 수풀 사이로 숨죽여 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "ground-level wide observer POV, extremely low ambient night lighting, high-contrast silhouettes",
            "t2i_prompt": "Photorealistic cinematic still. From a low ground-level observer perspective, uneven dirt covered with fallen pine needles fills the immediate foreground, leading toward a descending forest path in the lower-center background. Thick pine tree trunks stand densely on alternating sides in the foreground, creating a narrow vertical sightline gap. Framed within this distant gap, C23O25 in dark rural clothes, an Asian young man with black hair and a sun-tanned face, appears as a small but distinct silhouette at three-quarter angle from the right, looking down. He is caught mid-descent with one knee sharply bent, his body volume preserved against the dim ambient night fill by faint rim light tracing his shoulders and back, his jacket trailing slightly in the direction opposite to his downward motion. Another unnamed villager silhouette follows closely behind him in a similar hurried posture. The pitch-dark pine forest is illuminated only by very faint ambient night light with no lanterns present, while hazy smoke drifts faintly across the sky visible through the upper branches.",
            "outfit_assignments": [
              {
                "character_id": "C23",
                "outlook_id": "O25"
              }
            ],
            "source_facts": [
              "해송 나무 숲",
              "밤하늘에 희뿌연 연기가 지나간다",
              "등불 하나 들지 않은 두 세 명의 마을 청년들",
              "서둘러 숲길을 내려가는 모습"
            ],
            "visual_inferences": [
              "fixed_element nighttime_pine_forest: thick pine trunks, uneven dirt path, heavily shadowed environment",
              "silhouettes require faint rim light to preserve body volume and avoid flat cutouts",
              "ground level perspective places the dirt trail in the lower foreground"
            ],
            "creative_decisions": [
              "Framed the youths through a narrow gap between foreground trunks to emphasize the observer's concealed POV and the claustrophobic tension.",
              "Captured the mid-descent with a bent knee and backward-trailing fabric to convey fast, hurried motion while preserving a freeze-frame stillness."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8f5310a81fd30da4",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "0f239e20cee05834",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 69,
        "dependency_reason": "같은 해송 숲 배경 안에서의 시공간 연속성 유지",
        "_shot_index": 10,
        "visible_entities": [
          "C23"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 69,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Pan at ground level from behind the concealed pair and settle through gaps between tree trunks on the distant descending path. Hold a long wide composition in which the 금월도 마을 청년 silhouettes remain small but legible, each caught mid-descent with a bent knee and no lantern visible.",
            "lighting_mood": "Very low ambient night illumination preserves the youths as distant, high-contrast silhouettes without any lantern light.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "descending forest path",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "C23"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C23",
                "outlook_id": "O25"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "nighttime_pine_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A pitch-dark pine forest at night, with faint, hazy smoke drifting across the sky visible through the upper branches. Thick pine tree trunks stand densely alongside an unpaved dirt path, surrounded by low, tangled vegetation. The environment is heavily shadowed and illuminated only by very faint ambient night light.",
                "applies_to_shots": [
                  4,
                  9,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "해송 나무 숲",
                  "밤하늘에 희뿌연 연기가 지나간다",
                  "어두운 수풀 뒤",
                  "very low ambient night illumination"
                ],
                "visual_inferences": [
                  "The ground is uneven and covered with natural forest debris like fallen pine needles and dirt.",
                  "The low vegetation is dense enough to conceal people lying flat on the ground."
                ],
                "creative_decisions": [
                  "Maintain deep, contrasting shadows among the trees to emphasize the eerie, dangerous, and isolated atmosphere of the island."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 69,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C23O25",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "ab4c128ac90c5717"
      },
      {
        "scene_index": 70,
        "heading": "71. 실외. 동굴 앞 - 밤",
        "beat_title": "기괴한 동굴 입구 앞에서 멈춰 선 수리영과 주저하는 인우",
        "representative_moment": "어둠이 짙게 깔린 거대한 동굴 입구 앞에 선 C01과 C03의 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide static shot from behind at eye level, restrained ambient night lighting with stark contrast",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a dark casual jacket, a Korean early 20s woman, and C03O04 in a worn fishing suit, a Korean mid-20s man, stand in the lower-center midground, looking toward the cave interior beyond the full cave entrance in the upper-center background. Seen from several meters behind at standing eye level, both characters have their backs to the camera. C01O01 has her weight pitched forward toward the entrance, while C03O04 leans forward slightly to peer hesitantly into the gloom. The massive natural rock cave opening is flanked by bizarre, makeshift wooden pillars acting as structural supports, their rugged textures facing the camera. Restrained ambient night light traces the silhouettes of the two backs and the wooden threshold, leaving the shared destination between and above them completely engulfed in deep, impenetrable darkness.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "기괴하게 나무 기둥이 덧대어진 거대한 자연동굴 입구 앞 어둠 속에 멈춰 선 김지후(강수리영)와 정인우의 뒷모습.",
              "C01: back_to_camera, weight pitched toward entrance",
              "C03: back_to_camera, leaning forward to peer"
            ],
            "visual_inferences": [
              "fixed_element supported_cave_entrance: massive natural rock cave opening with bizarre makeshift wooden pillars",
              "Restrained ambient night light outlines the characters' backs against the completely black interior",
              "Characters are placed apart in the lower frame to emphasize the massive dark void above them"
            ],
            "creative_decisions": [
              "Wide eye-level framing behind the characters to establish the overwhelming scale of the dark cave entrance compared to human figures",
              "Stark contrast between the faintly lit wooden threshold and the impenetrable darkness to heighten suspense"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "39f4c91e3645ca2a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "89f01ea8667dc0ec",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 68,
        "dependency_reason": "이전 씬(68씬 1샷)에서 확립된 공간(동굴 앞)의 분위기와 환경 요소를 유지하기 위함 (ref_usage='exact_background').",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "C03",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 70,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Hold static at standing eye level several meters behind 김지후(강수리영) and 정인우, centering their backs beneath the full cave entrance. Place them apart across the lower middle of the wide frame so the supported opening and its dark interior remain the shared destination above and between them.",
            "lighting_mood": "Restrained ambient night light outlines the two backs and cave mouth while the interior remains in deep darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "full cave entrance",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "cave interior",
                  "label": "김지후(강수리영) and 정인우",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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",
              "L20"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "supported_cave_entrance",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A massive natural rock cave opening situated in a dark forest at night. Bizarre, makeshift wooden pillars are attached to the rock mouth, acting as structural supports. The exterior threshold is faintly outlined by low ambient night lighting, while the interior of the cave is completely engulfed in deep, impenetrable darkness.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "기괴하게 나무 기둥이 덧대어진 거대한 자연동굴 입구 앞 어둠",
                  "the supported opening and its dark interior",
                  "cave opening",
                  "cave threshold",
                  "Low ambient night illumination holds her outline at the cave threshold while her destination remains deeply dark."
                ],
                "visual_inferences": [
                  "The wooden pillars are rugged and uneven, adding an eerie, artificial touch to the natural formation."
                ],
                "creative_decisions": [
                  "The stark contrast between the dimly lit entrance structure and the pitch-black interior emphasizes a sense of dread and the unknown."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 68,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              }
            ],
            "forbidden_refs": [],
            "readiness_policy": "block_if_missing",
            "constraints": [
              "do not imply or describe a reference image that is not listed in required_refs (no phantom references)",
              "if a required character_outlook ref is missing, scene image generation must block before the image stage"
            ]
          },
          "render_contracts": [],
          "_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": "901b1007e87d7975"
      },
      {
        "scene_index": 70,
        "heading": "실외. 동굴 앞 - 밤",
        "beat_title": "망설임 없는 진입",
        "representative_moment": "수리영이 칠흑 같은 동굴 안을 향해 성큼 발을 내딛는다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height lateral tracking wide shot with low ambient night illumination, capturing the high contrast between the dimly lit threshold and pitch-black interior",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual outfit, a young pale Korean woman in her early 20s with long straight black hair, is positioned in the middle-right midground moving toward the dark cave interior in the middle-left background. She is seen from a lateral position slightly behind at a three-quarter angle from the right, mid-stride with one foot decisively lifted off the ground, preserving her inward travel direction with her hair trailing slightly behind. Her gaze is fixed off-screen into the void. A massive natural rock cave opening stands in the dark night forest, with bizarre, makeshift wooden pillars attached to the rock mouth acting as structural supports receding behind her as a visual threshold. Shot from waist height, her full body is framed against the cave entrance. Low ambient night illumination faintly outlines her figure along the exterior threshold, while the cave's destination remains completely engulfed in deep, impenetrable darkness.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S70 action: 수리영이 먼저 동굴 안으로 발을 들여놓는다.",
              "S70 description: 대답도 없이 저벅저벅 어둠 속으로 걸어들어간다."
            ],
            "visual_inferences": [
              "fixed_element supported_cave_entrance: massive natural rock cave opening with bizarre, makeshift wooden pillars",
              "Mid-stride pose with one foot lifted off the ground to visually freeze the '저벅저벅' motion",
              "Low ambient night illumination emphasizing the silhouette against the completely dark interior"
            ],
            "creative_decisions": [
              "Wide framing from a waist-height lateral position slightly behind the character to anchor her full body against the threshold while preserving the deep negative space of the cave on the left"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "78728fbba97eca5d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "8c68905bc0804c18",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 68,
        "dependency_reason": "동굴 앞 배경 및 기괴한 나무 기둥 구조물 시각적 일관성 유지 (S68_Shot1 참조)",
        "_shot_index": 3,
        "visible_entities": [
          "C01",
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 70,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track at waist height from a lateral position slightly behind 김지후(강수리영), holding her full body against the cave opening as one foot lifts for the first decisive step. Keep her on the middle-right of the frame with open darkness ahead to the left, preserving the inward travel direction without changing the established cave axis.",
            "lighting_mood": "Low ambient night illumination holds her outline at the cave threshold while her destination remains deeply dark.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "dark cave interior",
                  "screen_zone": "middle_left",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "dark cave interior",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_right",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "L20"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "supported_cave_entrance",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A massive natural rock cave opening situated in a dark forest at night. Bizarre, makeshift wooden pillars are attached to the rock mouth, acting as structural supports. The exterior threshold is faintly outlined by low ambient night lighting, while the interior of the cave is completely engulfed in deep, impenetrable darkness.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "기괴하게 나무 기둥이 덧대어진 거대한 자연동굴 입구 앞 어둠",
                  "the supported opening and its dark interior",
                  "cave opening",
                  "cave threshold",
                  "Low ambient night illumination holds her outline at the cave threshold while her destination remains deeply dark."
                ],
                "visual_inferences": [
                  "The wooden pillars are rugged and uneven, adding an eerie, artificial touch to the natural formation."
                ],
                "creative_decisions": [
                  "The stark contrast between the dimly lit entrance structure and the pitch-black interior emphasizes a sense of dread and the unknown."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 68,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "b6409dddee11ed44"
      },
      {
        "scene_index": 71,
        "heading": "72. 실내. 동굴 안 - 밤",
        "beat_title": "어둠 속에서 드러난 참혹한 흔적",
        "representative_moment": "플래시 불빛이 어둠 속 동굴 바닥에 흩어진 참혹한 인골들을 적나라하게 비추는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "knee-height steep downward angle, severe high-contrast flashlight illumination",
            "t2i_prompt": "Photorealistic cinematic still. Seen from a knee-height perspective angling steeply downward, broken human bones and torn severed remains are scattered across the damp, uneven stone floor extending from the lower foreground into the midground. A solitary, stark flashlight beam strikes the center of the frame, exposing the gruesome fragments in abrupt, severe high-contrast highlights. The focused circle of harsh white light isolates the bone textures and torn remnants, while the immediate frame edges and the surrounding pitch-black cave interior fall entirely into deep, impenetrable darkness.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: 플래시 불빛에 의해 동굴 바닥에 흩어진 사람의 뼈와 뜯겨진 신체 부위들이 적나라하게 드러난 클로즈업",
              "scene text action: 뜯어지고 부서진 사람의 손, 발, 머리… 그리고 각 부위의 인골들!"
            ],
            "visual_inferences": [
              "fixed_element flashlight_illumination: stark, highly directional beam creating severe highlights while plunging the surrounding area into impenetrable darkness",
              "observer perspective aiming steeply downward at the cave floor"
            ],
            "creative_decisions": [
              "close framing focusing exclusively on the illuminated floor section to emphasize the isolation and shock of the discovery",
              "harsh white flashlight tone contrasting completely against the surrounding black void to heighten the occult thriller mood"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cave",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chain anchor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7466708e5bbb7a3a",
              "owned_hash": "d4fd114230ca45a4",
              "camera_direction_hash": "16cee37e6b5f16ee",
              "owned_usage_hash": "bfa8eab677ac83f0",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 26,
        "dependency_reason": "동굴 내부 배경 분위기 일관성 유지 (close framing으로 인해 배경 자체는 생략되나 톤 유지 목적)",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 71,
            "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 knee height beside Inwoo's implied position, the camera holds less than a meter above the cave floor and angles steeply downward, preserving the floor-reveal tilt path. Broken human bones and severed remains spread from the lower foreground into the midground, with the intermittent flashlight beam selecting only part of the wider field at once.",
            "lighting_mood": "An intermittently failing flashlight exposes the remains in abrupt, high-contrast patches against the night-dark cave.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L22B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "flashlight_illumination",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The pitch-black cave interior is illuminated exclusively by a stark, highly directional flashlight beam. This solitary light source creates severe, high-contrast highlights on the targeted subjects while plunging the surrounding background environment into deep, impenetrable darkness.",
                "applies_to_shots": [
                  2,
                  14,
                  18
                ],
                "element_scope": "full",
                "source_facts": [
                  "플래시 불빛에 의해 동굴 바닥에 흩어진 사람의 뼈... 적나라하게 드러난",
                  "flashlight exposes the remains in abrupt, high-contrast patches against the night-dark cave",
                  "The flashlight makes Kang Minsook and the chains sharply legible while the surrounding night cave remains in deep contrast",
                  "The flashlight catches the tears and contorted facial planes with severe contrast while the cave behind her falls away into darkness"
                ],
                "visual_inferences": [
                  "The flashlight is the only significant light source, rendering any area outside its immediate beam almost completely invisible."
                ],
                "creative_decisions": [
                  "Utilizing harsh, focused lighting to isolate specific elements in the frame, thereby heightening the isolation and horror atmosphere of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 26,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "8f04916b9ab47dbc"
      },
      {
        "scene_index": 71,
        "heading": "72. 실내. 동굴 안 - 밤",
        "beat_title": "쇠사슬에 묶인 민숙 발견",
        "representative_moment": "어둠 속 플래시 불빛이 동굴 구석에 웅크린 채 쇠사슬에 묶인 강민숙을 비춘다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide angle, seated eye-height observer perspective, harsh high-contrast directional lighting",
            "t2i_prompt": "Photorealistic cinematic still. An Asian middle-aged woman in soiled clothes, curled tightly against the cave corner in the right-center midground. Seen at three-quarter angle from the left, her eyes fixed off-screen. She is restrained by the thick iron chains, the linked length crossing beside her body with the restrained end anchored toward the cave corner. The pitch-black cave interior is illuminated exclusively by a stark, highly directional flashlight beam striking from the left, creating severe, high-contrast highlights on the woman and the chains. The empty cave floor approach occupies the lower-left frame, viewed from a low observer at seated eye height, while the surrounding night cave plunges into deep, impenetrable darkness.",
            "outfit_assignments": [],
            "source_facts": [
              "동굴 구석, 몸을 잔뜩 웅크린 누군가가 불빛 속에 쑥 들어온다.",
              "처참한 몰골로… 쇠사슬에 묶여있다."
            ],
            "visual_inferences": [
              "The flashlight is the only significant light source, rendering any area outside its immediate beam almost completely invisible.",
              "low observer at seated eye height to align with the perspective of the characters crouching in the darkness"
            ],
            "creative_decisions": [
              "Empty foreground space emphasizes the isolation of the captive and the stark contrast of the flashlight beam.",
              "Wide framing captures the overall spatial relationship between the empty approach and the captive in the corner."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cave",
                "usage_kind": "anchor",
                "source_phrase": "cave corner"
              },
              {
                "owned_token": "chain",
                "usage_kind": "anchor",
                "source_phrase": "thick iron chains"
              },
              {
                "owned_token": "chain anchor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "00dd6b3a691e8611",
              "owned_hash": "d4fd114230ca45a4",
              "camera_direction_hash": "9614fc849b88672d",
              "owned_usage_hash": "fe0150b1edabb6da",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "cave",
                  "violating_phrase": "cave corner",
                  "reason": "The prompt references 'cave corner', 'cave interior', and 'cave floor' as spatial anchors and environmental context with no intent to redraw or modify the cave structure, which is consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "chain",
                  "violating_phrase": "thick iron chains",
                  "reason": "The prompt references the existing chains to describe their physical path beside the character and how the flashlight highlights them, serving as a positional and lighting anchor without demanding a redraw of the chains.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 71,
        "dependency_reason": "Same continuous space and lighting (flashlight beam) as the prior shot within the cave.",
        "_shot_index": 14,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 71,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At seated eye height beside Inwoo's implied position, the pan pauses from roughly four meters away when Kang Minsook's entire crouched body and restraining chains become readable in the cave corner. She occupies the right-center midground while the empty approach remains on the left, holding the spatial route for the following dolly forward.",
            "lighting_mood": "The flashlight makes Kang Minsook and the chains sharply legible while the surrounding night cave remains in deep contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L22B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bone",
              "cave",
              "chain",
              "chain anchor",
              "passage"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "flashlight_illumination",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The pitch-black cave interior is illuminated exclusively by a stark, highly directional flashlight beam. This solitary light source creates severe, high-contrast highlights on the targeted subjects while plunging the surrounding background environment into deep, impenetrable darkness.",
                "applies_to_shots": [
                  2,
                  14,
                  18
                ],
                "element_scope": "full",
                "source_facts": [
                  "플래시 불빛에 의해 동굴 바닥에 흩어진 사람의 뼈... 적나라하게 드러난",
                  "flashlight exposes the remains in abrupt, high-contrast patches against the night-dark cave",
                  "The flashlight makes Kang Minsook and the chains sharply legible while the surrounding night cave remains in deep contrast",
                  "The flashlight catches the tears and contorted facial planes with severe contrast while the cave behind her falls away into darkness"
                ],
                "visual_inferences": [
                  "The flashlight is the only significant light source, rendering any area outside its immediate beam almost completely invisible."
                ],
                "creative_decisions": [
                  "Utilizing harsh, focused lighting to isolate specific elements in the frame, thereby heightening the isolation and horror atmosphere of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 71,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L22B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "9893ac07c7928741"
      },
      {
        "scene_index": 71,
        "heading": "실내. 동굴 안 - 밤",
        "beat_title": "강민숙의 오열",
        "representative_moment": "A close-up of a captive middle-aged woman crying in despair, illuminated by a stark flashlight beam against pitch-black darkness.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level close framing with severe high-contrast flashlight illumination",
            "t2i_prompt": "Photorealistic cinematic still. An Asian middle-aged woman at three-quarter angle from the right, looking down, her tear-streaked face occupying most of the center-right frame. Her open mouth and painfully contracted features are captured in sharp focus. A short section of iron chain enters at the lower frame edge, pulled taut against her hunched posture. A stark, highly directional flashlight beam strikes her face, creating severe, high-contrast highlights that catch the tears and contorted planes of her expression. Behind her, [: a narrow trace of the soft cave corner boundary] quickly falls away into deep, impenetrable pitch-black darkness.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot description: Close-up of Kang Minsook's face, tear-streaked, open mouth, crying in despair.",
              "Staging: three_quarter_right, hunched within taut chains, gaze=down.",
              "Lighting: flashlight catches tears and contorted facial planes with severe contrast while the cave behind her falls away into darkness."
            ],
            "visual_inferences": [
              "fixed_element flashlight_illumination: stark, highly directional flashlight beam creates severe high-contrast highlights.",
              "Close framing isolates her face and the restraining chain, heightening the emotional impact of her captivity."
            ],
            "creative_decisions": [
              "Using center-right framing for the face to emphasize the physical restraint (chains) entering from the lower edge.",
              "Applying skipped_close_framing background binding by only describing the immediate soft cave corner with an L22 block."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cave",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chain anchor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7cbe35a05ada3b67",
              "owned_hash": "d4fd114230ca45a4",
              "camera_direction_hash": "7df022047c16a78d",
              "owned_usage_hash": "bfa8eab677ac83f0",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 71,
        "dependency_reason": "Same cave location as earlier in the scene, maintaining lighting consistency via fixed_element.",
        "_shot_index": 18,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 71,
            "shot_index": 18
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At Kang Minsook's eye level and slightly off her frontal axis, the camera remains static within close distance as her tear-streaked face occupies most of the center-right frame. Her open mouth and painfully contracted features stay sharp while only a narrow trace of the cave corner and chain remains at the frame edge.",
            "lighting_mood": "The flashlight catches the tears and contorted facial planes with severe contrast while the cave behind her falls away into darkness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L22B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "flashlight_illumination",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The pitch-black cave interior is illuminated exclusively by a stark, highly directional flashlight beam. This solitary light source creates severe, high-contrast highlights on the targeted subjects while plunging the surrounding background environment into deep, impenetrable darkness.",
                "applies_to_shots": [
                  2,
                  14,
                  18
                ],
                "element_scope": "full",
                "source_facts": [
                  "플래시 불빛에 의해 동굴 바닥에 흩어진 사람의 뼈... 적나라하게 드러난",
                  "flashlight exposes the remains in abrupt, high-contrast patches against the night-dark cave",
                  "The flashlight makes Kang Minsook and the chains sharply legible while the surrounding night cave remains in deep contrast",
                  "The flashlight catches the tears and contorted facial planes with severe contrast while the cave behind her falls away into darkness"
                ],
                "visual_inferences": [
                  "The flashlight is the only significant light source, rendering any area outside its immediate beam almost completely invisible."
                ],
                "creative_decisions": [
                  "Utilizing harsh, focused lighting to isolate specific elements in the frame, thereby heightening the isolation and horror atmosphere of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 71,
                "shot_index": 14,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "8793ec04f05e6483"
      },
      {
        "scene_index": 72,
        "heading": "73. 실외. 반월 식당 뒤뜰 - 밤",
        "beat_title": "허탈하게 타버린 창고를 바라보는 황 씨",
        "representative_moment": "An elderly Korean man in left profile stares blankly at the smoking ruins of the burned warehouse.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "standing eye-height observer view, medium distance lateral track, low-key nighttime ambient illumination",
            "t2i_prompt": "Photorealistic cinematic still. An elderly Korean man in a dark jacket stands in the middle-right, torso and head visible in left profile with slack shoulders, gazing off-screen toward the burned warehouse in the middle-left background. Plumes of dark, thick smoke continuously rise from the charred ruins into the night air. The outdoor backyard is dimly lit by low-key ambient nighttime illumination, casting heavy shadows over the scorched debris. The faint ambient light holds his vacant profile against the bleak environment, anchoring his motionless, despondent stance without introducing any additional visible light source.",
            "outfit_assignments": [],
            "source_facts": [
              "홀라당 다 타버린 창고가 거뭇한 연기를 내뿜고 있다.",
              "황 씨가 허탈한 표정으로 창고를 바라본다.",
              "At standing eye height on 황봉업(황 씨)'s side axis, the lateral track briefly settles around a medium distance to hold his vacant profile.",
              "He occupies the middle-right of the frame with slack shoulders and planted feet",
              "burned warehouse remains beyond his line of sight on the left background"
            ],
            "visual_inferences": [
              "fixed_element environment_state: The outdoor backyard at night features the charred, blackened remains of a completely burned-down warehouse.",
              "fixed_element environment_state: Plumes of dark, thick smoke continuously rise from the ruins into the night air.",
              "His planted feet are implied below the bottom frame edge based on the medium waist-up framing."
            ],
            "creative_decisions": [
              "Eye-level medium framing focusing on the man's vacant profile while keeping the burned warehouse visible in the background to show the narrative connection.",
              "Using deep, heavy shadows and low-key lighting to emphasize his despondent emotional state and the bleak ruins."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "barrel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "debris",
                "usage_kind": "anchor",
                "source_phrase": "casting heavy shadows over the scorched debris"
              },
              {
                "owned_token": "doorway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roof",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smoke",
                "usage_kind": "anchor",
                "source_phrase": "Plumes of dark, thick smoke continuously rise"
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a1d46fd5960d4270",
              "owned_hash": "b5575be483a8e45c",
              "camera_direction_hash": "2b4598f67ba5ffad",
              "owned_usage_hash": "b0ce0cb5a4c3de30",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "smoke",
                  "violating_phrase": "Plumes of dark, thick smoke continuously rise",
                  "reason": "The prompt describes thick smoke rising from the ruins, which acts as a redraw instruction contradicting the producer's 'anchor' declaration, but it is allowed because the shot_intent explicitly requires 'smoking ruins'.",
                  "verdict": "allowed_visual_state_change"
                },
                {
                  "owned_object": "debris",
                  "violating_phrase": "casting heavy shadows over the scorched debris",
                  "reason": "The prompt mentions the debris purely as a physical surface for casting shadows from ambient light, which matches the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 52,
        "dependency_reason": "반월 식당 뒤뜰의 화재 후 상태 및 공간적 일관성 유지",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 72,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At standing eye height on 황봉업(황 씨)'s side axis, the lateral track briefly settles around a medium distance to hold his vacant profile. He occupies the middle-right of the frame with slack shoulders and planted feet, while the burned warehouse remains beyond his line of sight on the left background.",
            "lighting_mood": "Low-key ambient illumination appropriate to the nighttime backyard holds his profile against the burned warehouse without introducing an additional visible source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "burned warehouse",
                  "screen_zone": "middle_left",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B06",
            "reference_usage": "exact_background",
            "owned_objects": [
              "barrel",
              "debris",
              "doorway",
              "light",
              "roof",
              "shed",
              "smoke",
              "utility pole",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "burned_warehouse_ruins",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor backyard at night features the charred, blackened remains of a completely burned-down warehouse. Plumes of dark, thick smoke continuously rise from the ruins into the night air. The surrounding area is dimly lit by low-key ambient nighttime illumination, casting heavy shadows over the scorched debris.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "홀라당 다 타버린 창고가 거뭇한 연기를 내뿜고 있다.",
                  "Low-key ambient illumination appropriate to the nighttime backyard",
                  "burned warehouse remains beyond his line of sight on the left background",
                  "burned yard reduced to an indistinct background trace"
                ],
                "visual_inferences": [
                  "The warehouse structure is severely collapsed and blackened by the recent intense fire.",
                  "The ambient light barely illuminates the dark smoke and charred materials."
                ],
                "creative_decisions": [
                  "Using deep shadows and minimal lighting to emphasize the bleak, ruined atmosphere of the backyard."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 52,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L35B06",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7d0bb5fca262c80d"
      },
      {
        "scene_index": 72,
        "heading": "73. 실외. 반월 식당 뒤뜰 - 밤",
        "beat_title": "Suppressed Anger",
        "representative_moment": "A tight facial close-up of an elderly Asian man clenching his jaw in suppressed anger.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level tight facial close-up, stark low-key nighttime lighting",
            "t2i_prompt": "Photorealistic cinematic still. An elderly Asian man at a three-quarter angle from the left, captured in an eye-level tight facial close-up occupying most of the frame. He is looking down, his jaw tightly clenched and neck rigid. The clenched jaw is positioned near the lower-right edge of the frame. Low-key nighttime illumination carves the tightened jawline in stark contrast against deep shadow on the opposite side of his face. Behind him, [: an indistinct, soft out-of-focus background trace of a blackened yard and plumes of thick dark smoke rising into the night air].",
            "outfit_assignments": [],
            "source_facts": [
              "황 씨가 (분노를 삭히며) 혼잣말",
              "황봉업(황 씨): three_quarter_left, jaw clenched, neck rigid, gaze=down, state=alive",
              "The dolly-in completes at eye level... stopping in an especially tight facial close-up... His face occupies most of the frame"
            ],
            "visual_inferences": [
              "fixed_element burned_warehouse_ruins: charred remains and dark thick smoke",
              "Low-key nighttime illumination creates a high contrast effect on the physical tension of the jaw",
              "Background is rendered as a soft, out-of-focus trace due to the tight close-up framing rule"
            ],
            "creative_decisions": [
              "Placed the clenched jaw near the lower-right of the frame as specified in the staging to emphasize physical restraint.",
              "Used deep shadows on the far side of the face to match the bleak, low-key lighting mood of the destroyed backyard."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "barrel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "debris",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "doorway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "roof",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smoke",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "de96b21d39faef86",
              "owned_hash": "b5575be483a8e45c",
              "camera_direction_hash": "23db166ac06cae10",
              "owned_usage_hash": "2db96c1449eddfe2",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 72,
        "dependency_reason": "previous_shot_refs indicates S72_Shot2 as exact_background, though rendered as an indistinct soft trace due to close framing.",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 72,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The dolly-in completes at eye level on 황봉업(황 씨)'s three-quarter axis, stopping in an especially tight facial close-up without becoming an extreme close-up. His face occupies most of the frame, with the clenched jaw set near the lower-right and the burned yard reduced to an indistinct background trace.",
            "lighting_mood": "Low-key nighttime illumination carves the tightened jaw and restrained anger in stark contrast while the background remains subdued.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L35B06",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "burned_warehouse_ruins",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor backyard at night features the charred, blackened remains of a completely burned-down warehouse. Plumes of dark, thick smoke continuously rise from the ruins into the night air. The surrounding area is dimly lit by low-key ambient nighttime illumination, casting heavy shadows over the scorched debris.",
                "applies_to_shots": [
                  2,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "홀라당 다 타버린 창고가 거뭇한 연기를 내뿜고 있다.",
                  "Low-key ambient illumination appropriate to the nighttime backyard",
                  "burned warehouse remains beyond his line of sight on the left background",
                  "burned yard reduced to an indistinct background trace"
                ],
                "visual_inferences": [
                  "The warehouse structure is severely collapsed and blackened by the recent intense fire.",
                  "The ambient light barely illuminates the dark smoke and charred materials."
                ],
                "creative_decisions": [
                  "Using deep shadows and minimal lighting to emphasize the bleak, ruined atmosphere of the backyard."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 72,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "c77882702920fff8"
      },
      {
        "scene_index": 73,
        "heading": "실외. 숲 속 만월제 도당 - 밤",
        "beat_title": "청년의 다급한 보고와 산들의 굳은 표정",
        "representative_moment": "C25가 산들의 귓가에 다급히 속삭이고, 산들의 표정이 심각하게 굳어지는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close conversational framing at ear height, high-contrast bonfire lighting",
            "t2i_prompt": "Photorealistic cinematic still. C25O28 in worn workwear, a Korean man in his 20s with short black hair, a tanned face, and a rough appearance, stands in the middle-left foreground in right profile. He shares the tight foreground space with a Korean middle-aged man at three-quarter angle from the left. C25O28 is leaning close, breath checked, looking down, his mouth positioned right next to the older man's ear. The middle-aged man maintains a stiffened posture, head inclined and shoulders visibly tightened and braced, looking off-screen with a deadpan serious expression and a deeply furrowed brow. An intense, off-screen blazing bonfire casts a strong, flickering light, producing heavy, low-key, high-contrast shadows and facial modeling on their overlapping profiles. [: The dark, out-of-focus edges of a night forest] border the frame, isolating the compressed gap between them against the pitch-black surroundings.",
            "outfit_assignments": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "source_facts": [
              "마을 청년이 다급히 뛰어와 산들에게 귓속말 (Shot 4 action)",
              "인상을 팍 쓰는 산들 (Shot 4 action)"
            ],
            "visual_inferences": [
              "fixed_element go_san_deul_tense_state applied to the middle-aged man: stiffened posture, shoulders visibly tightened and braced",
              "fixed_element bonfire_lit_night_forest: intense off-screen blazing bonfire casts a strong flickering light",
              "Go San-deul is rendered as a common noun (a Korean middle-aged man) due to ID policy"
            ],
            "creative_decisions": [
              "Close framing strictly focuses on the faces and the act of whispering to emphasize the secrecy and tension",
              "Used a tight foreground space anchor to fulfill the fg_bg_shared_anchor_rule for two interacting characters",
              "Replaced L23 with generic L01 edge description to comply with background_binding skipped_close_framing and user modification request"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bonfire",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "brazier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "candle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "canopy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drum",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fire pit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flashlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gong",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "loudspeaker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mallet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "offering table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radio",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "35f17d9f170a3d20",
              "owned_hash": "bf411eb1b92e6156",
              "camera_direction_hash": "15858f0e69d006f6",
              "owned_usage_hash": "5ec3b052b432602f",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "location reference (skipped for close framing)",
        "_shot_index": 4,
        "visible_entities": [
          "C25"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 73,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At ear height within close conversational distance, the final portion of the dolly-in compresses the gap between 금월도 마을 청년's mouth on the left and 고산들's ear on the right. Their overlapping profiles share the foreground, while 고산들's tightening brow remains readable behind the whispering mouth rather than turning the moment into a frontal portrait.",
            "lighting_mood": "Strong bonfire light produces low-key, high-contrast facial modeling against the surrounding night forest.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "금월도 마을 청년",
                  "screen_zone": "middle_left",
                  "target_id": "C25",
                  "target_kind": "character"
                }
              ]
            },
            "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": [
              "C25"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C25",
                "outlook_id": "O28"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L23B04",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "go_san_deul_tense_state",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "The man, Go San-deul, maintains a stiffened posture with his shoulders visibly tightened and braced. His facial expression is deadpan serious, featuring a deeply furrowed brow that conveys a sudden realization of urgency under the dramatic lighting.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "고산들's tightening brow remains readable behind the whispering mouth (Shot 4)",
                  "shoulders tightening (Shot 4)",
                  "고산들's furrowed brow is the sharpest element (Shot 5)",
                  "shoulders braced after whisper (Shot 5)"
                ],
                "visual_inferences": [
                  "His physical reaction remains rigid from the moment he hears the whisper to the moment he locks eyes with the ritual leader."
                ],
                "creative_decisions": [
                  "Focusing on his furrowed brow and stiff shoulders visually anchors the shift in the scene's mood from ritualistic frenzy to narrative crisis."
                ],
                "confidence": "high"
              },
              {
                "element_id": "bonfire_lit_night_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, outdoor night forest setting functioning as a ritual ground. An intense, off-screen blazing bonfire casts a strong, flickering light, producing heavy, high-contrast shadows and low-key illumination that distinctly models the figures against the pitch-black surroundings.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Strong bonfire light produces low-key, high-contrast facial modeling against the surrounding night forest (Shot 4)",
                  "Bonfire light separates... across the dark ritual ground with forceful, high-contrast modeling (Shot 5)"
                ],
                "visual_inferences": [
                  "The surrounding forest is dense enough to block out ambient night light, leaving the bonfire as the solitary, dominant source of illumination."
                ],
                "creative_decisions": [
                  "The harsh, forceful directional lighting from the fire enhances the dramatic tension and highlights the severe expressions of the characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C25O28",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "a4741e5bc340c2fe"
      },
      {
        "scene_index": 73,
        "heading": "실외. 숲 속 만월제 도당 - 밤",
        "beat_title": "불길한 보고와 교차하는 심각한 시선",
        "representative_moment": "A tense moment where Go San-deul and Kang Young-ran lock eyes across the ritual ground, illuminated by the high-contrast light of the bonfire.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium shot with deep focus and forceful, high-contrast, low-key lighting from an off-screen bonfire.",
            "t2i_prompt": "Photorealistic cinematic still. A Korean middle-aged man stands in the left foreground at eye level, sharing a single line of sight across the ritual space with a white-haired Korean elderly woman positioned near the ritual rock in the lower-right background. The man, seen at three-quarter angle from the right, maintains a stiffened posture with his shoulders visibly tightened and braced, his deeply furrowed brow serving as the sharpest element in the medium frame, his eyes fixed on the woman. The elderly woman, at three-quarter angle from the left, is paused mid-circle with a ritual bell raised, her eyes locked reciprocally on the man. An intense, off-screen blazing bonfire casts a forceful light, separating the two figures with heavy, high-contrast modeling and low-key shadows against the pitch-black outdoor night forest. Peripheral to their tense exchange, a traditional drum and gong rest faintly visible in the deep shadows.",
            "outfit_assignments": [],
            "source_facts": [
              "인상을 팍 쓰는 산들, 영란과 눈이 마주친다",
              "영란이 딸랑딸랑 무령을 흔들며 바위 주변을 돌아다닌다",
              "숲 속 만월제 도당 - 밤, 모닥불에 불이 활활 타오르고"
            ],
            "visual_inferences": [
              "fixed_element go_san_deul_tense_state: shoulders visibly tightened and braced, deeply furrowed brow",
              "fixed_element bonfire_lit_night_forest: intense off-screen bonfire casts strong flickering light with high-contrast shadows against pitch-black surroundings",
              "paused mid-circle with a ritual bell raised translates the action of shaking the bell into a static moment",
              "eye-level framing establishes the reciprocal eye contact across the space"
            ],
            "creative_decisions": [
              "Applied frame spatial contract (fsc_001) in the first sentence by placing the ritual rock in the lower-right background.",
              "Used 'sharing a single line of sight across the ritual space' to explicitly establish the foreground/background spatial anchor per fg_bg_shared_anchor_rule.",
              "Omitted entity IDs and used generic demographic descriptors (Korean middle-aged man, white-haired Korean elderly woman) as no character entities were assigned to this scene.",
              "Emphasized the furrowed brow as the sharpest element to anchor the narrative tension in the medium shot while keeping both characters visible."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "banner",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bonfire",
                "usage_kind": "anchor",
                "source_phrase": "intense, off-screen blazing bonfire casts a forceful light"
              },
              {
                "owned_token": "brazier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "candle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "canopy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drum",
                "usage_kind": "anchor",
                "source_phrase": "a traditional drum and gong rest faintly visible"
              },
              {
                "owned_token": "fire pit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flashlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gong",
                "usage_kind": "anchor",
                "source_phrase": "a traditional drum and gong rest faintly visible"
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "loudspeaker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mallet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "offering table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radio",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "60d8859d3dc13c5d",
              "owned_hash": "bf411eb1b92e6156",
              "camera_direction_hash": "d4d55ce03773bda9",
              "owned_usage_hash": "e8168fd386246271",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bonfire",
                  "violating_phrase": "off-screen blazing bonfire casts a forceful light",
                  "reason": "The prompt refers to the off-screen bonfire as a light source to establish high-contrast scene illumination, serving as a lighting anchor with no redraw instruction.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "drum",
                  "violating_phrase": "a traditional drum and gong rest faintly visible in the deep shadows",
                  "reason": "The prompt mentions the drum resting faintly visible in the background shadows, acting as a passive environmental anchor with no redraw or modification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "gong",
                  "violating_phrase": "a traditional drum and gong rest faintly visible in the deep shadows",
                  "reason": "The prompt mentions the gong resting faintly visible in the background shadows, acting as a passive environmental anchor with no redraw or modification.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 73,
        "dependency_reason": "Relies on the same exact_background (L23B04) and environmental lighting condition established in the prior shot of the ritual ground.",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 73,
            "shot_index": 5
          },
          "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 at eye level along the shared sightline, holding 고산들 in the left foreground at medium distance while 강영란(흰 머리 여자) remains clearly readable near the ritual rock in the right background. 고산들's furrowed brow is the sharpest element, but the depth composition preserves their reciprocal, serious eye contact across the ritual space.",
            "lighting_mood": "Bonfire light separates 고산들 and 강영란(흰 머리 여자) across the dark ritual ground with forceful, high-contrast modeling.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "ritual rock",
                  "screen_zone": "lower_right",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "altar",
              "banner",
              "bench",
              "bonfire",
              "brazier",
              "candle",
              "canopy",
              "drum",
              "fire pit",
              "flashlight",
              "gong",
              "lantern",
              "loudspeaker",
              "mallet",
              "mat",
              "offering table",
              "path",
              "radio",
              "rope"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "go_san_deul_tense_state",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "The man, Go San-deul, maintains a stiffened posture with his shoulders visibly tightened and braced. His facial expression is deadpan serious, featuring a deeply furrowed brow that conveys a sudden realization of urgency under the dramatic lighting.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "고산들's tightening brow remains readable behind the whispering mouth (Shot 4)",
                  "shoulders tightening (Shot 4)",
                  "고산들's furrowed brow is the sharpest element (Shot 5)",
                  "shoulders braced after whisper (Shot 5)"
                ],
                "visual_inferences": [
                  "His physical reaction remains rigid from the moment he hears the whisper to the moment he locks eyes with the ritual leader."
                ],
                "creative_decisions": [
                  "Focusing on his furrowed brow and stiff shoulders visually anchors the shift in the scene's mood from ritualistic frenzy to narrative crisis."
                ],
                "confidence": "high"
              },
              {
                "element_id": "bonfire_lit_night_forest",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, outdoor night forest setting functioning as a ritual ground. An intense, off-screen blazing bonfire casts a strong, flickering light, producing heavy, high-contrast shadows and low-key illumination that distinctly models the figures against the pitch-black surroundings.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Strong bonfire light produces low-key, high-contrast facial modeling against the surrounding night forest (Shot 4)",
                  "Bonfire light separates... across the dark ritual ground with forceful, high-contrast modeling (Shot 5)"
                ],
                "visual_inferences": [
                  "The surrounding forest is dense enough to block out ambient night light, leaving the bonfire as the solitary, dominant source of illumination."
                ],
                "creative_decisions": [
                  "The harsh, forceful directional lighting from the fire enhances the dramatic tension and highlights the severe expressions of the characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 73,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L23B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "79d3174b6ec19e68"
      },
      {
        "beat_title": "어둠 속에서 터진 분노",
        "dependency_reason": "Scene 69 shot 10 is listed as the preceding location-related shot, but no background reference is attached; this shot therefore depicts the night forest directly without reference-image attribution.",
        "dependent_scene_index": 69,
        "heading": "실외. 불빛 없는 숲속 - 밤",
        "representative_moment": "한 한국인 중년 여성이 숲길 한가운데에서 뒤쪽을 향해 몸을 반쯤 돌린 채 분노로 입을 크게 벌린 순간.",
        "scene_index": 74,
        "scene_type": "normal",
        "t2i_variations": [
          {
            "applied_frame_spatial_constraint_ids": [],
            "camera_effect": "Eye-level observer composition from the woman's three-quarter front-right side, with a forward-set perspective and a restrained dark palette.",
            "confidence": "high",
            "creative_decisions": [
              "Frame the woman from roughly the knees upward so her planted heel and half-rotated torso remain geometrically legible.",
              "Keep the off-screen daughter absent, expressing the confrontation through the woman's gaze and the empty space beyond the frame.",
              "Use sharp focus on the angry open mouth and rigid half-turn, with enough background clarity to retain the route behind her."
            ],
            "outfit_assignments": [],
            "owned_object_usage": [],
            "reference_phrase_kinds": [],
            "source_facts": [
              "Shot description: 강민숙이 몸을 뒤로 반쯤 돌린 채 분노에 찬 얼굴로 입을 크게 벌리고 있는 찰나.",
              "Scene text: 숲속은 밤이며 깜깜하고 불빛 하나 없다.",
              "Scene text: 민숙은 우뚝 멈춰 뒤돌아보며 딸에게 화난 목소리로 외친다."
            ],
            "t2i_prompt": "Photorealistic cinematic still. An upright, alert Korean middle-aged woman in practical dark rural clothes occupies the center-left midground, seen at eye level at a three-quarter angle from the right, one heel firmly planted and her torso held in an incomplete half-turn. Her mouth is wide open in anger, her eyes fixed toward her daughter’s off-screen position, with rigid shoulders and a confrontational stance. Camera focus rests on her angry expression, open mouth, and the spatial tension directed beyond the frame. An unlit forest route remains visible behind her along the group’s direction of travel; dense, indistinct foliage and shadowy tree trunks recede behind both sides of her body without obscuring her face. Extremely low natural ambient illumination barely reveals visible surfaces, with no artificial light source anywhere in the surroundings and a restrained, desaturated dark palette.",
            "variant_label": "var_1",
            "visual_inferences": [
              "Fixed environment element: the dense forest is submerged in profound darkness, with indistinct foliage and shadowy tree trunks under extremely low natural ambient illumination.",
              "DP staging: her half-rotated torso occupies the center-left midground from an eye-level three-quarter front-right viewpoint.",
              "The off-screen daughter is excluded so the frame remains centered on the selected instant of the mother's confrontation."
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7c52f3eae04fa07d",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d87a1c05b8c63344",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 74,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level on 강민숙(홍은미)'s three-quarter front side, the dolly-in eases as she stops and catches the instant before completing her turn. Her half-rotated torso occupies the center-left midground, mouth open in anger toward 김지후(강수리영)'s off-screen position, with the forest path retained behind her to preserve the group's direction of travel.",
            "lighting_mood": "Extremely low natural ambient illumination appropriate to an unlit forest at night keeps the confrontation stark without specifying an additional source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "unlit_night_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is a dense forest at night, submerged in profound darkness. There are no artificial light sources visible anywhere in the surroundings. The background consists of dark, indistinct foliage and shadowy tree trunks, illuminated only by extremely low natural ambient light.",
                "applies_to_shots": [
                  2,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "숲속 - 밤",
                  "깜깜한 숲, 불빛 하나 없어도",
                  "Extremely low natural ambient illumination appropriate to an unlit forest at night"
                ],
                "visual_inferences": [
                  "Moonlight or starlight filtering dimly through the dense canopy is the only minimal light source, keeping the overall atmosphere murky and stark."
                ],
                "creative_decisions": [
                  "Maintaining a heavy contrast and deep shadows to emphasize the isolation, danger, and tension of being chased in the dark."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 69,
                "shot_index": 10,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "7b4d23647415f1e3"
      },
      {
        "scene_index": 74,
        "heading": "실외. 숲속 - 밤",
        "beat_title": "휘파람 소리에 놀라 멈칫하는 수리영",
        "representative_moment": "어두운 숲속에서 들려온 기괴한 휘파람 소리에 화들짝 놀라 고개를 홱 돌린 채 굳어버린 수리영의 긴장된 얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close framing on the subject's right profile, with directional negative space and shallow depth of field in extremely low ambient light.",
            "t2i_prompt": "Photorealistic cinematic still. An Asian young woman in a dark casual jacket is captured in a close frame, shown in right profile with her head snapped toward the right edge. Her tense face sits near the center, eyes looking off-screen into the directional negative space left ahead of her arrested gaze. Her checked forward momentum remains visible in her subtly angled shoulders. Extremely low natural ambient illumination barely traces her jawline and cheek, preserving a stark, murky atmosphere without revealing the sound's origin. Immediately behind her, dark, indistinct foliage and shadowy tree trunks fall into a soft, out-of-focus background, anchoring her in the profound darkness of the unlit night forest.",
            "outfit_assignments": [],
            "source_facts": [
              "S74 action: '발걸음을 재촉하면서도 소리나는 쪽을 돌아보는 수리영.'",
              "shot description: '숲 저편에서 날아든 휘파람 소리에 화들짝 놀란 표정으로 고개를 홱 돌린 채 굳어있는 김지후(강수리영)'",
              "Su-ri-young's state: profile_right, stride checked, head snapped, gaze=off_screen, state=alive"
            ],
            "visual_inferences": [
              "fixed_element unlit_night_forest_environment: 'The environment is a dense forest at night, submerged in profound darkness... dark, indistinct foliage and shadowy tree trunks, illuminated only by extremely low natural ambient light.'",
              "Close framing omits deep background layout, reducing the environment to soft-focus immediate surroundings to isolate her reaction."
            ],
            "creative_decisions": [
              "Placed directional negative space on the right side of the frame to visually emphasize the unseen, off-screen source of the whistle she is reacting to.",
              "Used extremely low natural ambient lighting to sculpt her profile with minimal highlights, enhancing the suspense and isolation."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e23cdc843a116804",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "ebdea05781ae0ab1",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 69,
        "dependency_reason": "Shares the same unlit night forest environment and extremely low lighting mood established in S69 S9.",
        "_shot_index": 8,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 74,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level and close on 김지후(강수리영)'s front three-quarter side, the camera locks immediately after her head snaps toward the off-screen whistle. Her tense face sits near center with her checked forward momentum still visible at the shoulders, leaving directional negative space on the side toward which she listens.",
            "lighting_mood": "Extremely low natural ambient illumination appropriate to the unlit night forest holds her frozen reaction without revealing the whistle's source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "unlit_night_forest_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is a dense forest at night, submerged in profound darkness. There are no artificial light sources visible anywhere in the surroundings. The background consists of dark, indistinct foliage and shadowy tree trunks, illuminated only by extremely low natural ambient light.",
                "applies_to_shots": [
                  2,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "숲속 - 밤",
                  "깜깜한 숲, 불빛 하나 없어도",
                  "Extremely low natural ambient illumination appropriate to an unlit forest at night"
                ],
                "visual_inferences": [
                  "Moonlight or starlight filtering dimly through the dense canopy is the only minimal light source, keeping the overall atmosphere murky and stark."
                ],
                "creative_decisions": [
                  "Maintaining a heavy contrast and deep shadows to emphasize the isolation, danger, and tension of being chased in the dark."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 69,
                "shot_index": 9,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "c64d7bd5ef3b750e"
      },
      {
        "scene_index": 75,
        "heading": "76. 실내. 동굴 안 - 밤",
        "beat_title": "텅 빈 동굴과 끊어진 쇠사슬",
        "representative_moment": "동굴 바닥에 끊어진 쇠사슬 단면이 횃불 불빛을 받으며 나뒹굴고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low-level insert framing focusing on the severed chain in warm, flickering torchlight with high contrast",
            "t2i_prompt": "Photorealistic cinematic still. Captured just above floor level, the severed end of a thick iron chain rests in the lower-center foreground on a rough stone cave floor, its broken link sharp and in absolute focus. The remaining chain links trail diagonally backward into the midground, leading toward an empty, shadowy holding area. Flickering warm torchlight from off-frame casts deep, elongated shadows across the damp stone surface, highlighting the heavy metallic texture of the broken chain with concentrated contrast against the pitch-black cave background.",
            "outfit_assignments": [],
            "source_facts": [
              "S76 action: '끊겨있는 쇠사슬. 텅 빈 공간.'",
              "shot description: 동굴 바닥에 쓸쓸히 나뒹구는 끊어진 쇠사슬 단면의 클로즈업"
            ],
            "visual_inferences": [
              "Torchlight from arriving village youths creates warm, flickering light and deep shadows on the stone floor",
              "The chain trailing diagonally backward serves as spatial evidence connecting the severed end to the empty holding area"
            ],
            "creative_decisions": [
              "Insert framing isolates the broken link in the lower-center foreground while letting the midground fall into softer focus to emphasize the emptiness",
              "Concentrated contrast lighting separates the cold iron from the dark, rough cave floor"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "20d669edecf3c064",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "7595ffee5ccbcc2a",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 68,
        "dependency_reason": "S68_Shot7의 동굴 배경 형태와 분위기를 일관되게 유지하기 위함",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 75,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Just above floor level, the static camera isolates the severed end of the iron chain in the lower-center foreground while keeping it below forty percent of the frame. The chain leads diagonally toward the empty holding area in the midground, providing spatial evidence of escape and preserving the upward path toward 고산들 for the next shot.",
            "lighting_mood": "Torchlight from the arriving village youths reveals the broken chain against the night-dark cave with concentrated contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 68,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "966e68c94aa9fc44"
      },
      {
        "scene_index": 76,
        "heading": "77. 실외. 숲속 도축장 옆 길 - 밤",
        "beat_title": "갑자기 발걸음을 멈추는 민숙과 일행",
        "representative_moment": "거친 숨을 몰아쉬며 도망치던 민숙이 갑자기 숲길에 우뚝 멈춰 서고, 뒤따르던 지후와 인우도 놀라며 멈춰 서는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide shot from chest height, static backward track frame",
            "t2i_prompt": "Photorealistic cinematic still. Shot from a chest-height camera on a dirt path, capturing a wide frame with the ground visible in the lower edge. In the middle-left foreground, an Asian middle-aged woman in a dark windbreaker stands in full figure on the path, at three-quarter angle from the right, halted mid-stride with one foot forward, her mouth half-open and chest heaving, her eyes fixed off-screen. Staggered behind her along the same shared path in the midground, an Asian young woman in a heavy coat, at three-quarter angle from the right, brakes with her knees bent, and an Asian young man in a jacket, at three-quarter angle from the left, throws his weight onto his heel; both have their eyes fixed on the middle-aged woman. The surrounding dark forest with thick trees encloses both sides of the frame. The exterior environment is enveloped in deep night darkness, illuminated by moonlight that casts a restrained blue-black contrast over the low-key nocturnal scene, preserving their full-body silhouettes against the cold shadows.",
            "outfit_assignments": [],
            "source_facts": [
              "거친 숨을 몰아쉬며 발길을 재촉하던 민숙이 갑자기 우뚝 멈춰선다.",
              "열심히 뒤따라오던 수리영과 인우도 멈춰서고…",
              "어둠 속 달빛 아래",
              "입을 반쯤 벌린 채 숲길에 우뚝 멈춰 선 강민숙의 전신."
            ],
            "visual_inferences": [
              "fixed_element: moonlit_night_exterior establishing a blue-black contrast",
              "camera at chest height capturing wide full-body silhouettes of the three characters staggered on the path",
              "the destination (slaughterhouse) remains off-screen as the characters halt mid-stride"
            ],
            "creative_decisions": [
              "Positioning the middle-aged woman in the middle-left foreground to emphasize her sudden halt, while using the shared path to anchor the two followers staggered behind her.",
              "Utilizing deep nocturnal shadows and thick trees on the frame edges to create an enclosing, suspenseful atmosphere without revealing the off-screen attraction."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hook",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hose",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "anchor",
                "source_phrase": "on a dirt path"
              },
              {
                "owned_token": "rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "road",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slaughterhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "anchor",
                "source_phrase": "thick trees"
              },
              {
                "owned_token": "utility light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "worktable",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "05110bfd2d59f1b7",
              "owned_hash": "46a5541df12304a7",
              "camera_direction_hash": "09bf04fae4219add",
              "owned_usage_hash": "ecc4a89b61bfc085",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "path",
                  "violating_phrase": "on a dirt path",
                  "reason": "The prompt refers to the dirt path to position the characters spatially, which is a valid anchor reference matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "tree",
                  "violating_phrase": "thick trees",
                  "reason": "The prompt mentions thick trees to describe the surrounding forest as a background enclosure, which is a valid anchor reference matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 72,
        "dependency_reason": "같은 공간(숲길 및 도축장 주변)이 배경이므로, 달빛 아래 푸르고 검은 색감의 야외 톤과 공간 구조의 연속성을 유지해야 함.",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 76,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From chest height on the path ahead of the group, the backward track settles into a static wide frame at the exact instant 강민숙(홍은미) arrests her stride. She occupies the middle-left in full figure with her body turned three-quarters toward the unseen attraction, while 김지후(강수리영) and 정인우 remain smaller and staggered behind her along the path.",
            "lighting_mood": "Night darkness and the stated moonlight are rendered in restrained blue-black contrast, preserving the three full-body silhouettes without revealing their destination yet.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "awning",
              "crate",
              "door",
              "drain",
              "hook",
              "hose",
              "path",
              "rail",
              "road",
              "shrub",
              "slaughterhouse",
              "tree",
              "utility light",
              "worktable"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "moonlit_night_exterior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior environment is enveloped in deep night darkness, illuminated primarily by moonlight. The lighting maintains a restrained blue-black contrast, establishing a low-key nocturnal atmosphere in the surrounding forest setting.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "어둠 속 달빛 아래",
                  "Night darkness and the stated moonlight are rendered in restrained blue-black contrast",
                  "night exterior"
                ],
                "visual_inferences": [
                  "The moonlight serves as the main ambient light source, casting cold blue-black tones over the outdoor environment."
                ],
                "creative_decisions": [
                  "Using low-key lighting and blue-black contrast to emphasize the mysterious and tense atmosphere of the night forest."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 72,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L35B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7fc883eb53ea3272"
      },
      {
        "scene_index": 76,
        "heading": "실외. 숲속 도축장 옆 길 - 밤",
        "beat_title": "도축장 안으로 뛰어드는 민숙",
        "representative_moment": "민숙이 다급하게 도축장의 열린 문턱을 넘어 어둠 속으로 뛰어 들어가는 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium-wide threshold composition from chest height, dolly-in paused",
            "t2i_prompt": "Photorealistic cinematic still. An open slaughterhouse doorway stands in the middle-center background. A Korean middle-aged woman in a dark jacket, captured from chest height just behind and slightly to her left, occupies the center-right foreground. With her back to the camera, she is lunging across the threshold, her gaze fixed off-screen into the pitch-black interior. Her body leans heavily forward as her upper half disappears into the dark interior, while one trailing leg remains planted on the ground outside. The exterior environment is enveloped in deep night darkness, illuminated by moonlight that casts a restrained blue-black contrast over the surrounding forest, contrasting sharply with the low-key ambient illumination at the threshold.",
            "outfit_assignments": [],
            "source_facts": [
              "민숙은 대답도 없이 도축장 안으로 쑥 들어가버린다.",
              "어둠 속 달빛 아래 염소 도축장"
            ],
            "visual_inferences": [
              "The open doorway forms a hard frame around her partially entered body",
              "Her body leans forward dynamically to convey the rush of entering",
              "moonlit_night_exterior: The exterior environment is enveloped in deep night darkness"
            ],
            "creative_decisions": [
              "Positioned the camera at chest height behind the subject to emphasize the transition from the blue-black moonlit exterior into the unknown darkness of the interior",
              "Placed the figure in the center-right foreground to clearly show the trailing leg and the depth of the doorway"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hook",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hose",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "road",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slaughterhouse",
                "usage_kind": "anchor",
                "source_phrase": "open slaughterhouse doorway"
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "worktable",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "519ff1aa26fb392b",
              "owned_hash": "46a5541df12304a7",
              "camera_direction_hash": "111ff3f90047b4fa",
              "owned_usage_hash": "99850473867ed28c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "open slaughterhouse doorway",
                  "reason": "The prompt mentions the 'open slaughterhouse doorway' to establish the spatial composition for the character's movement, which functions as an anchor reference to the existing door structure, though the producer declared it absent.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "slaughterhouse",
                  "violating_phrase": "open slaughterhouse doorway",
                  "reason": "The prompt refers to the 'slaughterhouse doorway' in the background as a reference point for the character's entry, which matches the producer's declaration of anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 76,
        "dependency_reason": "exact_background from the previous shot to maintain the established moonlit exterior and slaughterhouse entrance",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 76,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height just behind and slightly left of 강민숙(홍은미), the dolly-in pauses in a medium-wide threshold composition as she lunges through the open doorway. Her back and forward-leaning body occupy the center-right, with one trailing leg still outside and the dark interior held open ahead of her.",
            "lighting_mood": "The dark interior is held in low-key contrast against the night exterior, with only setting-appropriate ambient illumination at the open threshold.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "open slaughterhouse doorway",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "awning",
              "crate",
              "door",
              "drain",
              "hook",
              "hose",
              "path",
              "rail",
              "road",
              "shrub",
              "slaughterhouse",
              "tree",
              "utility light",
              "worktable"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "moonlit_night_exterior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The exterior environment is enveloped in deep night darkness, illuminated primarily by moonlight. The lighting maintains a restrained blue-black contrast, establishing a low-key nocturnal atmosphere in the surrounding forest setting.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "어둠 속 달빛 아래",
                  "Night darkness and the stated moonlight are rendered in restrained blue-black contrast",
                  "night exterior"
                ],
                "visual_inferences": [
                  "The moonlight serves as the main ambient light source, casting cold blue-black tones over the outdoor environment."
                ],
                "creative_decisions": [
                  "Using low-key lighting and blue-black contrast to emphasize the mysterious and tense atmosphere of the night forest."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 76,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L35B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "607d36c8bf108736"
      },
      {
        "scene_index": 77,
        "heading": "78. 실내. 도축장 - 밤",
        "beat_title": "염소 피를 뒤집어쓰며 경고하는 민숙과 경악하는 일행",
        "representative_moment": "어두운 도축장 한가운데서 C04가 양동이의 피를 머리 위로 쏟아붓고, 뒤편의 두 사람이 기겁하며 물러서는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height wide shot, low-key ambient lighting with deep earthy and blue-black tones contrasting with deep red blood",
            "t2i_prompt": "Photorealistic cinematic still. C04O05 in middle-aged outdoor wear, an Asian woman in her late 40s with a slender face, neat black hair, and an elegant impression, stands beneath the falling blood in the middle-center midground of the slaughterhouse interior. Facing the camera, her arms are raised, holding a tipped bucket above her head, her gaze directed down. Deep red blood pours heavily from the open top of the bucket over her hair and torso, the container's side angled toward the camera. In the background to one side, occupying the same dark room, two figures react to the sight. A young Asian woman, at three-quarter angle from the left, is recoiling with forearms lifted, eyes fixed on the central woman. Beside her, a young Asian man at three-quarter angle from the right is stepping back, his shoulders tensed, eyes also fixed on the central woman. The chest-height wide frame captures the dark, earthy, and blue-black palette of the space. Low-key ambient light isolates the vivid red blood against the subdued background, preserving the established grim atmosphere, with a threshold and a heavy door subtly visible in the deep shadows.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "Min-sook pouring a bucket full of red goat blood over her head",
              "Ji-hu and In-woo frightened and recoiling in the background",
              "Dark slaughterhouse interior context from the beat"
            ],
            "visual_inferences": [
              "fixed_element slaughterhouse_ambient_environment: earthy and blue-black color palette, low-key ambient lighting",
              "Chest-height wide framing to keep Min-sook central while including the reacting figures in the background"
            ],
            "creative_decisions": [
              "Described the unregistered characters (Ji-hu and In-woo) with generic demographic descriptors since they lack allowed IDs",
              "Emphasized the strong contrast between the deep red blood and the low-key blue-black surroundings"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bucket",
                "usage_kind": "redraw",
                "source_phrase": "holding a tipped bucket above her head"
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "with a threshold and a heavy door subtly visible in the deep shadows"
              },
              {
                "owned_token": "hook rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "knife rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slaughter table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage room",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "anchor",
                "source_phrase": "with a threshold and a heavy door subtly visible in the deep shadows"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5501a85c47665ec1",
              "owned_hash": "abde2befa6b212e5",
              "camera_direction_hash": "a2cf39449dbc75e2",
              "owned_usage_hash": "2cac27d968674d0a",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bucket",
                  "violating_phrase": "holding a tipped bucket above her head, her gaze directed down. Deep red blood pours heavily from the open top of the bucket over her hair and torso, the container's side angled toward the camera",
                  "reason": "The bucket is an owned prop held and tipped by the character, describing physical interaction and orientation geometry without redesigning its core visual characteristics, which fits the prop contact exception.",
                  "verdict": "allowed_prop_contact"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "with a threshold and a heavy door subtly visible in the deep shadows",
                  "reason": "The door is mentioned purely as a background environmental anchor to establish the low-key atmosphere, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "threshold",
                  "violating_phrase": "with a threshold and a heavy door subtly visible in the deep shadows",
                  "reason": "The threshold is mentioned purely as a background spatial reference in the shadows, which is a valid anchor use matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 33,
        "dependency_reason": "동일한 도축장 내부 배경 및 조명 환경 연속성 유지",
        "_shot_index": 1,
        "visible_entities": [
          "C04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 77,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From chest height near the entrance, a slow frontal dolly-in catches 강민숙(홍은미) at center as the raised bucket tips and goat blood begins to fall over her head and torso. The frame stays wide enough for 김지후(강수리영) and 정인우 to remain together at one side in the background, their recoiling bodies providing scale and reaction.",
            "lighting_mood": "Low-key ambient light appropriate to the dark slaughterhouse isolates the deep red goat blood against subdued earthy and blue-black surroundings.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "강민숙(홍은미) beneath the falling blood",
                  "screen_zone": "middle_center",
                  "target_id": "C04",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L26B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bucket",
              "door",
              "hook rail",
              "knife rack",
              "shed",
              "slaughter table",
              "storage room",
              "threshold",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "slaughterhouse_ambient_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The slaughterhouse interior maintains a dark, earthy, and blue-black color palette. Low-key ambient lighting preserves the deep darkness of the room, establishing a grim and tense atmosphere throughout the space.",
                "applies_to_shots": [
                  1,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key ambient light appropriate to the dark slaughterhouse",
                  "subdued earthy and blue-black surroundings",
                  "Low-key slaughterhouse ambience",
                  "Low-key ambient illumination preserves the room's darkness"
                ],
                "visual_inferences": [],
                "creative_decisions": [
                  "Consistently utilizing earthy and blue-black tones across the shots to maintain the dark, gloomy atmosphere and contrast strongly with the deep red blood"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 33,
                "shot_index": 12,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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": "L26B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "8f46978fdcdf5363"
      },
      {
        "scene_index": 77,
        "heading": "실내. 도축장 - 밤",
        "beat_title": "수리영이 인우에게 염소 피를 들이부음",
        "representative_moment": "김지후(C01)가 정인우(C03)를 향해 염소 피가 든 양동이를 기울여 피를 들이붓는 찰나.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "At upper-body height and medium distance, dolly-in, low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. In the middle-left midground, C01O01 in a dark casual jacket, an Asian woman in her early 20s representing 김지후(강수리영), stands reaching for 정인우 with the tipped bucket. In the middle-right midground, C03O04 in waterproof fishing wear, an Asian man in his mid 20s representing 정인우 in the path of the pour, stands reacting. C01O01, seen in left profile with braced arms thrust forward, holds the tilted bucket with her eyes fixed on C03O04. A solid stream of red goat blood cuts diagonally across the air between them. C03O04, caught at a three-quarter angle from the right with his eyes fixed on C01O01, shows his upper body recoiling backward under the airborne pour. The slaughterhouse interior maintains a dark, earthy, and blue-black color palette. Low-key ambient lighting preserves the deep darkness of the room, keeping the surrounding background subdued behind the two-person action and giving the red blood the strongest chromatic weight. A wooden door and a hook rail are faintly visible in the dim shadows of the room.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "김지후(강수리영)가 피가 든 양동이를 기울여 정인우의 몸을 향해 붉은 피가 쏟아져 내리는 중간 찰나.",
              "C01: profile_left, braced, arms thrust forward, gaze=looks_at_character→C03, state=alive",
              "C03: three_quarter_right, recoiling under the pour, gaze=looks_at_character→C01, state=alive"
            ],
            "visual_inferences": [
              "fixed_element slaughterhouse_ambient_environment: The slaughterhouse interior maintains a dark, earthy, and blue-black color palette. Low-key ambient lighting preserves the deep darkness.",
              "The bucket is actively held and tilted by C01 to pour the blood diagonally toward C03."
            ],
            "creative_decisions": [
              "Medium framing captures both figures in the midground to emphasize the diagonal line of the blood stream between them.",
              "Incorporated the 'door' and 'hook rail' owned objects faintly in the background to anchor the depth of the slaughterhouse without distracting from the main action."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bucket",
                "usage_kind": "redraw",
                "source_phrase": "reaching for 정인우 with the tipped bucket"
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "A wooden door and a hook rail are faintly visible in the dim shadows of the room."
              },
              {
                "owned_token": "hook rail",
                "usage_kind": "anchor",
                "source_phrase": "A wooden door and a hook rail are faintly visible in the dim shadows of the room."
              },
              {
                "owned_token": "knife rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slaughter table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage room",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "63979fc2d9ba5756",
              "owned_hash": "abde2befa6b212e5",
              "camera_direction_hash": "9941547ff88cf5a9",
              "owned_usage_hash": "a0164c0ad7390d62",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bucket",
                  "violating_phrase": "holds the tilted bucket",
                  "reason": "The character is physically interacting with and tilting the existing bucket to pour blood, which constitutes an allowed prop contact as it only describes the geometry of the physical interaction without redesigning the object's appearance.",
                  "verdict": "allowed_prop_contact"
                },
                {
                  "owned_object": "door",
                  "violating_phrase": "A wooden door and a hook rail are faintly visible in the dim shadows of the room.",
                  "reason": "The door is mentioned merely as an environmental anchor faintly visible in the background shadows to establish the scene layout, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "hook rail",
                  "violating_phrase": "A wooden door and a hook rail are faintly visible in the dim shadows of the room.",
                  "reason": "The hook rail is referenced strictly as a static background element to define the scene's lighting and shadows, which is a valid anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 33,
        "dependency_reason": "exact_background ref_usage from Scene 33 Shot 13 to maintain slaughterhouse location and ambient lighting consistency",
        "_shot_index": 8,
        "visible_entities": [
          "C01",
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 77,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At upper-body height and medium distance, the dolly-in holds 김지후(강수리영) in left profile as she thrusts the tilted bucket toward 정인우 on the right. The stream of red goat blood cuts diagonally between them, while 정인우's recoiling upper body remains fully readable along the path of the pour.",
            "lighting_mood": "Low-key slaughterhouse ambience gives the red blood the strongest chromatic weight while keeping both figures in hard, tense separation.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "reaches_for",
                  "gesture_target_label": "정인우 with the tipped bucket",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_left",
                  "target_id": "C01",
                  "target_kind": "character"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "정인우 in the path of the pour",
                  "screen_zone": "middle_right",
                  "target_id": "C03",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L26B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bucket",
              "door",
              "hook rail",
              "knife rack",
              "shed",
              "slaughter table",
              "storage room",
              "threshold",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "slaughterhouse_ambient_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The slaughterhouse interior maintains a dark, earthy, and blue-black color palette. Low-key ambient lighting preserves the deep darkness of the room, establishing a grim and tense atmosphere throughout the space.",
                "applies_to_shots": [
                  1,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key ambient light appropriate to the dark slaughterhouse",
                  "subdued earthy and blue-black surroundings",
                  "Low-key slaughterhouse ambience",
                  "Low-key ambient illumination preserves the room's darkness"
                ],
                "visual_inferences": [],
                "creative_decisions": [
                  "Consistently utilizing earthy and blue-black tones across the shots to maintain the dark, gloomy atmosphere and contrast strongly with the deep red blood"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 33,
                "shot_index": 13,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L26B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "906095b16bc9283a"
      },
      {
        "scene_index": 77,
        "heading": "78. 실내. 도축장 - 밤",
        "beat_title": "피를 뒤집어쓰는 수리영",
        "representative_moment": "김지후(C01)가 양동이를 들어 올리며 자신의 머리 위로 쏟아지는 염소 피를 뒤집어쓴 채 눈을 질끈 감고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium-close slightly low angle from chest height, high contrast between deep red and low-key blue-black",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a young Korean woman, stands beneath the raised bucket in the middle-center midground. Captured from beside her at chest height in a medium-close, slightly low angle, her upper body and raised arms occupy the center-left frame. She is seen at three-quarter angle from the right, shoulders hunched, arms overhead gripping the inverted bucket. Her face is visible with eyes closed. Thick, deep red blood pours down from the bucket, whose outer side faces the camera, cascading over her head and shoulders in a frozen mid-pour moment. A narrow strip of the same dark slaughterhouse interior is visible beside her, maintaining an earthy and blue-black color palette. Low-key ambient illumination preserves the room's deep darkness, catching glistening highlights on the red blood tracing her form.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S77 action: 수리영도 재빨리 염소피 양동이를 뒤집어 쓴다.",
              "shot description: C01 emptying the bucket over her head, blood descending through the upper frame",
              "character pose: three_quarter_right, shoulders hunched, arms overhead, gaze=closed_eyes"
            ],
            "visual_inferences": [
              "fixed_element slaughterhouse_ambient_environment: dark, earthy, and blue-black color palette with low-key lighting",
              "blood cascading over shoulders frozen in mid-pour to capture the instantaneous action",
              "chest-height camera placement frames the torso and the bucket overhead"
            ],
            "creative_decisions": [
              "Placed C01 slightly off-center to the left to leave a strip of the exact same dark room background visible for exact_background continuity",
              "Enhanced the wet specular highlights on the blood to contrast against the matte, low-key ambient darkness of the slaughterhouse"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bucket",
                "usage_kind": "redraw",
                "source_phrase": "stands beneath the raised bucket"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "hook rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "knife rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "slaughter table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage room",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "threshold",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c0d8058954e549c9",
              "owned_hash": "abde2befa6b212e5",
              "camera_direction_hash": "1a13f53f16fe0cc0",
              "owned_usage_hash": "49b09e96d220a40d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bucket",
                  "violating_phrase": "arms overhead gripping the inverted bucket. ... blood pours down from the bucket, whose outer side faces the camera",
                  "reason": "The character physically grips and inverts the bucket to pour blood, which is a physical interaction and state change required by the shot intent without altering the bucket's design.",
                  "verdict": "allowed_prop_contact"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 33,
        "dependency_reason": "previous_shot_refs (exact_background) - maintains the exact same slaughterhouse background interior established in previous shots while rendering a new instantaneous action in the foreground",
        "_shot_index": 10,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 77,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From beside 김지후(강수리영) at chest height, the tracking camera ends in a medium-close, slightly low angle that includes her upper body, raised arms, and the bucket above her head. She occupies the center-left as the blood descends through the upper frame, leaving a narrow strip of the dark room visible beside her.",
            "lighting_mood": "Low-key ambient illumination preserves the room's darkness while the deep red blood remains clearly legible across her head and upper body.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "김지후(강수리영) beneath the raised bucket",
                  "screen_zone": "middle_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L26B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bucket",
              "door",
              "hook rail",
              "knife rack",
              "shed",
              "slaughter table",
              "storage room",
              "threshold",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "slaughterhouse_ambient_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The slaughterhouse interior maintains a dark, earthy, and blue-black color palette. Low-key ambient lighting preserves the deep darkness of the room, establishing a grim and tense atmosphere throughout the space.",
                "applies_to_shots": [
                  1,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key ambient light appropriate to the dark slaughterhouse",
                  "subdued earthy and blue-black surroundings",
                  "Low-key slaughterhouse ambience",
                  "Low-key ambient illumination preserves the room's darkness"
                ],
                "visual_inferences": [],
                "creative_decisions": [
                  "Consistently utilizing earthy and blue-black tones across the shots to maintain the dark, gloomy atmosphere and contrast strongly with the deep red blood"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 33,
                "shot_index": 13,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L26B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7ddb0d1967ba3473"
      },
      {
        "scene_index": 78,
        "heading": "실외. 숲 속 만월제 도당 - 밤",
        "beat_title": "만월제 도당에서의 기괴한 대치와 강영란의 추격 지시",
        "representative_moment": "모닥불 불빛과 핏빛 바위를 등진 강영란이 날 선 표정으로 산들을 마주 보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level medium-long wide framing, static frontal OTS composition, high-contrast low-key lighting with deep red and gold firelight against blue-black night.",
            "t2i_prompt": "Photorealistic cinematic still. A Korean elderly woman with white hair stands upright at the center, facing the camera, with the blood-colored rock in the upper-center background. In the foreground, a Korean adult man stands with his back to camera, feet planted and torso braced, his dark head and shoulders occupying the lower frame edge as an over-shoulder figure. They face each other across the low flickering campfire, sharing the exact same dense forest clearing. The woman maintains a rigid, tense posture, chin thrust and shoulders tense, her eyes fixed on the man, projecting an authoritative and eerie presence. The man's eyes are fixed on the woman. The fire occupies a low foreground band, casting muted gold and deep red variations across the woman, leaving the surrounding dark, dense blue-black night forest and a thick tree silhouette in deep contrast.",
            "outfit_assignments": [],
            "source_facts": [
              "강영란(흰 머리 여자)이 기괴하고 날 선 표정으로 서 있는 전경",
              "일렁이는 모닥불 불빛과 핏빛 바위",
              "고산들: back_to_camera, feet planted, torso braced, gaze=looks_at_character",
              "At eye level and medium-long distance, a static frontal composition places 강영란(흰 머리 여자) at center",
              "고산들 appears only as a dark over-shoulder figure at the lower edge"
            ],
            "visual_inferences": [
              "fixed_element young_ran_rigid_posture: The white-haired woman stands upright with a rigid, tense posture. Her shoulders are tense and she holds her position steadily without softening.",
              "fixed_element night_forest_campfire: A dark, dense blue-black forest at night illuminated by a low flickering campfire. The fire casts muted gold and deep red variations."
            ],
            "creative_decisions": [
              "Utilized exact background reference from prior shot, anchoring the scene with a shared forest clearing and a background tree silhouette.",
              "Positioned the man at the lower edge to create an over-the-shoulder depth anchor, emphasizing the woman's central authority and tense posture."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "brazier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flashlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "loudspeaker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "map",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "offering table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radio",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "searchlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrine",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "standing stone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "torch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "anchor",
                "source_phrase": "a thick tree silhouette in deep contrast"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7c9bb326d5b2aaf0",
              "owned_hash": "6434a34e1e32dc2c",
              "camera_direction_hash": "2e2f343450dfb1a8",
              "owned_usage_hash": "db194324ed26eed0",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "tree",
                  "violating_phrase": "a thick tree silhouette in deep contrast",
                  "reason": "The prompt references a thick tree silhouette for background lighting and contrast, which acts as a scene anchor, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 60,
        "dependency_reason": "exact_background 연속성 유지 (동일한 만월제 도당 공간과 모닥불/핏빛 바위 배경 공유)",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 78,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level and medium-long distance, a static frontal composition places 강영란(흰 머리 여자) at center with the fire low in the near foreground and the blood-colored rock rising behind her. 고산들 appears only as a dark over-shoulder figure at the lower edge, turning the direct view of her sharpened expression into his confronted position.",
            "lighting_mood": "The stated flickering firelight casts muted gold and deep red variation across 강영란(흰 머리 여자), leaving the surrounding night in dense blue-black contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "blood-colored rock",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L27B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "altar",
              "brazier",
              "flashlight",
              "loudspeaker",
              "map",
              "offering table",
              "path",
              "radio",
              "rope",
              "searchlight",
              "shrine",
              "standing stone",
              "stone wall",
              "torch",
              "tree"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "young_ran_rigid_posture",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "The white-haired woman stands upright with a rigid, tense posture. Her shoulders are tense and she holds her position steadily without softening, projecting an authoritative and eerie presence.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "강영란(흰 머리 여자)이 기괴하고 날 선 표정으로 서 있는 전경",
                  "chin thrust, shoulders tense",
                  "remains upright... body rigid"
                ],
                "visual_inferences": [
                  "She stands firmly on the ground, establishing a dominant position over the other character."
                ],
                "creative_decisions": [
                  "Emphasizing her unyielding physical tension to visually translate her bizarre and sharp demeanor."
                ],
                "confidence": "high"
              },
              {
                "element_id": "night_forest_campfire",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, dense blue-black forest at night illuminated by a low flickering campfire. The fire casts muted gold and deep red variations across the scene, highlighting a distinctive blood-colored rock formation rising in the background.",
                "applies_to_shots": [
                  1,
                  4,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "일렁이는 모닥불 불빛과 핏빛 바위",
                  "dense blue-black contrast",
                  "flickering firelight supplies restrained muted-gold highlights and deep red accents"
                ],
                "visual_inferences": [
                  "The campfire is situated in the near foreground between the characters, acting as the primary practical light source.",
                  "The blood-colored rock looms behind the characters, adding to the eerie atmosphere."
                ],
                "creative_decisions": [
                  "Using the stark contrast between the deep blue-black night and the red/gold firelight to heighten the dramatic and ominous mood of the ritual site."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 60,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L27B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "16bf4632ac635909"
      },
      {
        "scene_index": 78,
        "heading": "실외. 숲 속 만월제 도당 - 밤",
        "beat_title": "산들의 결의와 영란의 개입",
        "representative_moment": "고산들이 고개를 숙인 채 인사하고, 강영란은 꼿꼿한 자세로 그를 내려다보는 가슴 높이 앵글의 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height perspective, low flickering firelight providing high contrast",
            "t2i_prompt": "Photorealistic cinematic still. An Asian young man in a dark jacket occupies the left and center foreground, visible from the waist up in right profile, folded into a deep bow, looking down toward the ground. An elderly Asian woman with white hair in a dark outfit stands upright in the right midground on the same shared dirt clearing, seen at three-quarter angle from the left, her chin lowered, shoulders tense, body rigid, her eyes fixed on the bowing man. A low flickering campfire sits between them, casting muted gold highlights and deep red accents across their features in high contrast. A distinctive blood-colored rock and dense blue-black trees rise in the dark night forest background.",
            "outfit_assignments": [],
            "source_facts": [
              "고산들이 배를 사수하겠다며 꾸벅 인사를 함",
              "강영란이 핏빛 바위를 배경으로 꼿꼿하게 서서 산들을 응시함",
              "From chest height beside the space between them",
              "Flickering firelight supplies restrained muted-gold highlights and deep red accents"
            ],
            "visual_inferences": [
              "young_ran_rigid_posture: The white-haired woman stands upright with a rigid, tense posture, projecting an eerie presence.",
              "night_forest_campfire: dark dense blue-black forest illuminated by a low flickering campfire.",
              "The figures share the same physical space, separated by the campfire that acts as a practical light source."
            ],
            "creative_decisions": [
              "Adopted a chest-height frame without explicit camera-type terminology, capturing the man's deep bow and the woman's tense rigidity.",
              "Used the campfire as an anchor between the two characters in the shared clearing to naturally integrate the high-contrast lighting.",
              "Omitted L27 tags per request and used generic demographic descriptors since no entities were assigned."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "brazier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flashlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "loudspeaker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "map",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "offering table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radio",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "searchlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrine",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "standing stone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "torch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "anchor",
                "source_phrase": "dense blue-black trees rise in the dark night forest background"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d04ad3093416eb86",
              "owned_hash": "6434a34e1e32dc2c",
              "camera_direction_hash": "9e59d019b99acd3a",
              "owned_usage_hash": "5ddbc5a6d5c06347",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "tree",
                  "violating_phrase": "dense blue-black trees rise in the dark night forest background",
                  "reason": "The prompt mentions 'dense blue-black trees' to establish the dark forest background setting, acting as a spatial anchor consistent with the producer's echo.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 45,
        "dependency_reason": "location exact_background",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 78,
            "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 chest height beside the space between them, the dolly-in stops at medium distance when 고산들 reaches the deepest point of his bow. His folded profile occupies the left and center foreground, while 강영란(흰 머리 여자) remains upright at the right in the same spatial plane, receiving the gesture without softening.",
            "lighting_mood": "Flickering firelight supplies restrained muted-gold highlights and deep red accents against the surrounding night, with the bow held in high contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L27B04",
            "reference_usage": "exact_background",
            "owned_objects": [
              "altar",
              "brazier",
              "flashlight",
              "loudspeaker",
              "map",
              "offering table",
              "path",
              "radio",
              "rope",
              "searchlight",
              "shrine",
              "standing stone",
              "stone wall",
              "torch",
              "tree"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "young_ran_rigid_posture",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "The white-haired woman stands upright with a rigid, tense posture. Her shoulders are tense and she holds her position steadily without softening, projecting an authoritative and eerie presence.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "강영란(흰 머리 여자)이 기괴하고 날 선 표정으로 서 있는 전경",
                  "chin thrust, shoulders tense",
                  "remains upright... body rigid"
                ],
                "visual_inferences": [
                  "She stands firmly on the ground, establishing a dominant position over the other character."
                ],
                "creative_decisions": [
                  "Emphasizing her unyielding physical tension to visually translate her bizarre and sharp demeanor."
                ],
                "confidence": "high"
              },
              {
                "element_id": "night_forest_campfire",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, dense blue-black forest at night illuminated by a low flickering campfire. The fire casts muted gold and deep red variations across the scene, highlighting a distinctive blood-colored rock formation rising in the background.",
                "applies_to_shots": [
                  1,
                  4,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "일렁이는 모닥불 불빛과 핏빛 바위",
                  "dense blue-black contrast",
                  "flickering firelight supplies restrained muted-gold highlights and deep red accents"
                ],
                "visual_inferences": [
                  "The campfire is situated in the near foreground between the characters, acting as the primary practical light source.",
                  "The blood-colored rock looms behind the characters, adding to the eerie atmosphere."
                ],
                "creative_decisions": [
                  "Using the stark contrast between the deep blue-black night and the red/gold firelight to heighten the dramatic and ominous mood of the ritual site."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 45,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L27B04",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "699bef027d208a53"
      },
      {
        "scene_index": 78,
        "heading": "실외. 숲 속 만월제 도당 - 밤",
        "beat_title": "예상치 못한 동행 선언과 굳어버린 표정",
        "representative_moment": "영란의 말에 돌아가려던 행동을 멈추고 미간을 구기며 차갑게 굳어버린 산들의 클로즈업 얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level tight close-up, low-key lighting with warm flickering edge highlights against a dark out-of-focus background.",
            "t2i_prompt": "Photorealistic cinematic still. A tight close-up on the face of a Korean man in his 30s in a dark jacket, occupying most of the center frame, his turn arrested, facing the camera. His expression is suddenly cold, featuring a furrowed brow and a tightly set jaw, eyes fixed just past the lens on an off-screen figure. The surrounding dark night environment falls completely out of focus, remaining only as minimal soft context. Peripheral flickering firelight creates unstable muted-gold and deep-red edge variation tracing his jawline and cheek, while his hardened facial features are held in heavy low-key contrast against the deep shadow.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: 고산들 tight close-up, isolating his furrowed brow, tightened jaw, and suddenly cold expression.",
              "shot description: face occupies most of the center frame while his eyes remain fixed just past the lens.",
              "S78 action: 산들 (표정이 굳는다) ..."
            ],
            "visual_inferences": [
              "fixed_element night_forest_campfire: peripheral firelight creates muted-gold and deep-red edge variation on his face.",
              "turn arrested: body posture implies he was about to leave, emphasizing the sudden freeze.",
              "background completely out of focus due to close framing constraints (skipped background)."
            ],
            "creative_decisions": [
              "Using extremely shallow depth of field to isolate the hardened expression.",
              "Placing the firelight as an edge highlight to emphasize the jawline and tension without illuminating the entire face, maintaining the low-key cinematic contrast."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "brazier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flashlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "loudspeaker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "map",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "offering table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "radio",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "searchlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrine",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "standing stone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "torch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "975e3e8e7bd2cd35",
              "owned_hash": "6434a34e1e32dc2c",
              "camera_direction_hash": "1e500f605574cc18",
              "owned_usage_hash": "7de4c91a9fdfe752",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 78,
        "dependency_reason": "같은 공간, 직전 샷에서 이어지는 인물의 클로즈업 반응 샷 (zoom_in_detail 연속성 적용, 동일 조명/시간 유지)",
        "_shot_index": 9,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 78,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The eye-level dolly-in finishes directly before 고산들 in a tight close-up, isolating his furrowed brow, tightened jaw, and suddenly cold expression. His face occupies most of the center frame while his eyes remain fixed just past the lens toward 강영란(흰 머리 여자), preserving the confrontation without showing her.",
            "lighting_mood": "Flickering firelight creates unstable muted-gold and deep-red edge variation while the close-up holds his hardened features in low-key contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L27B04",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "night_forest_campfire",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A dark, dense blue-black forest at night illuminated by a low flickering campfire. The fire casts muted gold and deep red variations across the scene, highlighting a distinctive blood-colored rock formation rising in the background.",
                "applies_to_shots": [
                  1,
                  4,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "일렁이는 모닥불 불빛과 핏빛 바위",
                  "dense blue-black contrast",
                  "flickering firelight supplies restrained muted-gold highlights and deep red accents"
                ],
                "visual_inferences": [
                  "The campfire is situated in the near foreground between the characters, acting as the primary practical light source.",
                  "The blood-colored rock looms behind the characters, adding to the eerie atmosphere."
                ],
                "creative_decisions": [
                  "Using the stark contrast between the deep blue-black night and the red/gold firelight to heighten the dramatic and ominous mood of the ritual site."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 78,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "187f577275ca87c6"
      },
      {
        "scene_index": 79,
        "heading": "80. 실외. 선착장 - 밤",
        "beat_title": "마을 청년들의 수색 집결",
        "representative_moment": "마을 청년들이 밝은 조명 아래 선착장에 모여 정박된 낚시 어선 주변을 가득 채우고 랜턴을 든 채 수색을 준비한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Elevated wide crane angle, stark high-contrast lighting",
            "t2i_prompt": "Photorealistic cinematic still. A moored fishing boat rests in the upper-center background, seen from an elevated wide crane angle looking down across a brightly illuminated dock. A dense group of Korean young men crowds shoulder to shoulder on the concrete dock in the lower half of the frame, forming a night search party. They wear casual, utilitarian modern clothing and hold various portable flashlights and lanterns. Facing away from the camera, their collective gaze is intently directed downwards, pointing their bright light beams at the ground. Stark, high-contrast overhead dock lighting carves the wooden vessel and the dense gathering out of the dark night, casting deep, sharp shadows on the ground.",
            "outfit_assignments": [],
            "source_facts": [
              "선착장 주변에 조명이 밝게 켜지고, 정박한 황 씨의 낚시 어선 주위로 청년들이 모여든다.",
              "각자 플래쉬 라이트, 조명 등을 들고 수리영 일행을 찾으러 나선다.",
              "Shot description: elevated wide position, brightly illuminated dock, moored fishing boat, dense gathering of youths packing the dock."
            ],
            "visual_inferences": [
              "fixed_element search_party_villagers: Korean islanders in casual utilitarian modern clothing, collective gaze intently directed downwards.",
              "Elevated crane angle dictates the boat's placement in the upper background and the crowd in the lower frame.",
              "High-contrast lighting creates dramatic shadows against the pitch-black night, amplifying the scale and urgency of the search."
            ],
            "creative_decisions": [
              "Positioned the moored fishing boat strictly in the upper-center background to fulfill the fsc_001 spatial contract.",
              "Used descriptive phrases like 'stark, high-contrast overhead dock lighting' to faithfully translate the DP lighting directive."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b4fef279f3fe5fd3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d82ee26cc461e2f5",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 74,
        "dependency_reason": "previous_shot_refs indicates a location reference from Scene 74 Shot 8 (the dock background).",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 79,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the elevated wide position, the opening crane frame looks down across the brightly illuminated dock toward the moored fishing boat and the dense gathering around it. The boat lies across the middle of the image while clusters of 금월도 마을 청년 pack the surrounding dock, establishing both the search scale and the route the camera will later descend into.",
            "lighting_mood": "The explicitly bright dock lighting carves the boat and crowded search party out of the surrounding night with stark, high-contrast visibility.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "moored fishing boat",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "search_party_villagers",
                "element_type": "character_state",
                "character_name": "Villagers",
                "description": "A dense group of Korean islanders forming a night search party. They are dressed in casual, utilitarian modern clothing and hold various portable flashlights and lanterns in their hands. Their collective gaze is intently directed downwards as they illuminate and search the dark surroundings.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "곧 집집마다 밖으로 나오는 마을 주민들. 각자 플래쉬 라이트, 조명 등을 들고 수리영 일행을 찾으러 나선다.",
                  "금월도 마을 청년들이 빽빽하게 모여든 전경.",
                  "금월도 마을 주민들이 플래시 불빛을 어두운 바위 틈새 한 곳으로 고정해 비춘 채 서 있는 찰나."
                ],
                "visual_inferences": [
                  "The villagers wear practical, everyday modern clothes suitable for an urgent nighttime search.",
                  "They consistently look downwards, directing their handheld lights to scan for any hidden fugitives."
                ],
                "creative_decisions": [
                  "Emphasized the unifying visual motif of multiple handheld flashlights held by the crowd to establish a cohesive identity for the search party across different locations."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 74,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "795b10e0b4a65d69"
      },
      {
        "scene_index": 79,
        "heading": "실외. 선착장 - 밤",
        "beat_title": "바위 틈을 비추는 주민들의 불빛",
        "representative_moment": "마을 주민들이 일제히 든 플래시 불빛이 어두운 바위 틈 하나로 향하며 기괴한 긴장감을 자아내는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level static wide frame, harsh lighting contrast from converging beams against dark night",
            "t2i_prompt": "Photorealistic cinematic still. A narrow gap between rocks is visible in the middle-right background, serving as the focal point. A dense group of Korean islanders in casual utilitarian modern clothing occupies the left and center of the wide frame, seen at eye level and at a three-quarter angle from the right. The villagers lean toward the rock gap, looking down with intense focus. They hold various portable flashlights and lanterns firmly in their hands, every light-emitting end aimed fixedly toward the gap, creating parallel directional cues. The surrounding rocks and the residents remain subdued in the deep night darkness, the converging beams concentrating harsh bright contrast entirely on the rock crevice without overwhelming the human scale.",
            "outfit_assignments": [],
            "source_facts": [
              "금월도 마을 주민들이 플래시 불빛을 어두운 바위 틈새 한 곳으로 고정해 비춘 채 서 있는 찰나.",
              "각자 플래쉬 라이트, 조명 등을 들고 수리영 일행을 찾으러 나선다."
            ],
            "visual_inferences": [
              "fixed_element character_state: A dense group of Korean islanders forming a night search party in casual, utilitarian modern clothing.",
              "fixed_element character_state: Their collective gaze is intently directed downwards as they illuminate the surroundings.",
              "The villagers are positioned on the left and center to direct all beams toward the right edge."
            ],
            "creative_decisions": [
              "Placed the 'narrow gap between rocks' explicitly in the 'middle-right background' in the very first sentence to satisfy the spatial contract.",
              "Emphasized the harsh contrast of the flashlight beams hitting the rocks while leaving the human figures in subdued night shadows to heighten the thriller atmosphere.",
              "Structured the prompt to strictly capture a frozen moment of pointing beams without any continuous action verbs."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "dc3b33b281f38748",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "cbcb653274c44316",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 79,
        "dependency_reason": "같은 씬 내 선착장/바위 지대의 연속된 상황이므로 공간 분위기 및 군중의 복장/상태 연속성 유지.",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 79,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level and diagonally beside the residents' shared line of attention, a static wide frame holds the group along the left and center while the narrow rock gap remains visible at the right. Every flashlight is frozen in the same aim, creating converging beams that terminate at the gap without allowing any one flashlight to overwhelm the human scale.",
            "lighting_mood": "The fixed flashlight beams provide the stated illumination, concentrating harsh contrast on one rock gap while the residents and surrounding rocks remain subdued in the night.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "narrow gap between rocks",
                  "screen_zone": "middle_right",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "search_party_villagers",
                "element_type": "character_state",
                "character_name": "Villagers",
                "description": "A dense group of Korean islanders forming a night search party. They are dressed in casual, utilitarian modern clothing and hold various portable flashlights and lanterns in their hands. Their collective gaze is intently directed downwards as they illuminate and search the dark surroundings.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "곧 집집마다 밖으로 나오는 마을 주민들. 각자 플래쉬 라이트, 조명 등을 들고 수리영 일행을 찾으러 나선다.",
                  "금월도 마을 청년들이 빽빽하게 모여든 전경.",
                  "금월도 마을 주민들이 플래시 불빛을 어두운 바위 틈새 한 곳으로 고정해 비춘 채 서 있는 찰나."
                ],
                "visual_inferences": [
                  "The villagers wear practical, everyday modern clothes suitable for an urgent nighttime search.",
                  "They consistently look downwards, directing their handheld lights to scan for any hidden fugitives."
                ],
                "creative_decisions": [
                  "Emphasized the unifying visual motif of multiple handheld flashlights held by the crowd to establish a cohesive identity for the search party across different locations."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 79,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "32dd6a078219f8ea"
      },
      {
        "scene_index": 80,
        "heading": "실내. 어구 창고 - 밤",
        "beat_title": "창고 구석 그물 더미에 숨죽인 민숙",
        "representative_moment": "A Korean middle-aged woman with a blood-covered face is tightly framed through a narrow opening in a net pile, looking off-screen.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "voyeuristic close framing through a narrow opening with shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. A Korean middle-aged woman in dark clothing, her face covered in blood, is tightly framed in a close, eye-level composition. She is crouched at a three-quarter angle from the right, looking off-screen. Her face sits near the center, revealed through a narrow opening in [: an old net pile], with the blurred, coarse textures of the nets occupying the side margins. The low-key warehouse darkness isolates her features in restrained earthy neutrals and deep red, with no distinct light source. In the faintly legible, out-of-focus background, a narrow aisle recedes toward a closed wooden door.",
            "outfit_assignments": [],
            "source_facts": [
              "Kang Min-sook's blood-covered face sits near center in a close, eye-level composition.",
              "Character state: crouched within net pile, at three-quarter angle from the right, looking off-screen.",
              "Camera direction: lens tightens through a narrow opening in the old net pile, blurred net edges occupying side margins.",
              "Background elements: aisle and closed door remain faintly legible behind her."
            ],
            "visual_inferences": [
              "The background aisle and door are rendered softly out of focus to adhere to the close framing scale rule.",
              "The voyeuristic perspective is established by using the net pile as an out-of-focus frame-edge surface."
            ],
            "creative_decisions": [
              "Used restrained earthy neutrals and deep red under low-key lighting to emphasize the bloody horror element without breaking the dark warehouse mood.",
              "Replaced the background location tag with L02 as L01 was explicitly requested to be removed."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "06f71f65b328b74c",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "190e84d2d84dd2df",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 62,
        "dependency_reason": "어구 창고 내부의 이전 샷(S62_Shot4)과의 공간적, 조명적 연속성을 유지",
        "_shot_index": 14,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 80,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the final chest-height position beside the concealed group, the lens tightens through a narrow opening in the old net pile, with blurred net edges occupying only the side margins. Kang Min-sook's blood-covered face sits near center in a close, eye-level composition, her crouched body largely concealed while the aisle and closed door remain faintly legible behind her.",
            "lighting_mood": "Low-key warehouse darkness isolates the blood-covered face in restrained earthy neutrals and deep red without introducing a new visible light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 62,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "715034b9c6c2d9bd"
      },
      {
        "scene_index": 80,
        "heading": "82. 몽타주",
        "beat_title": "육혈귀의 기원 - 아낙의 변이",
        "representative_moment": "A close-up of a peasant woman screaming in agony under the moonlight as she transforms into a flesh-eating monster.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "frontal eye-level close-up, extreme facial distance, stark high-contrast moonlight with desaturated memory tones",
            "t2i_prompt": "Photorealistic cinematic still. Close framing at extreme facial distance, frontal eye-level angle. An East Asian woman in ragged clothes, facing the camera, torso arched mid-convulsion with her contorted shoulders tracing the lower edge of the frame. Her face dominates the center, looking up, severe bloodshot eyes staring upward, mouth stretched wide open in a silent agonizing scream, newly sharpened teeth visible with stark contrast. Bright full-moon night light cuts hard across her convulsing face against a desaturated memory-like color palette. [: a narrow peripheral glimpse of a dark dirt courtyard behind her, stark cool moonlight spilling from just above the upper frame boundary].",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: A woman writhes in agony under a full moon, eyes bloodshot, teeth sharpening.",
              "camera_direction: Extreme facial distance, frontal eye-level, face near center, contorted shoulders at lower edge.",
              "lighting_mood: Bright full-moon night light cuts hard across the convulsing face with stark contrast."
            ],
            "visual_inferences": [
              "The desaturated color palette reflects the memory/flashback perception mode.",
              "The extreme close-up isolates the physical horror of the transformation, hiding the rest of the body."
            ],
            "creative_decisions": [
              "Used a generic demographic descriptor (East Asian woman) as no specific C## ID is registered for this historical flashback figure.",
              "Placed the moon's light source just outside the upper frame to justify the stark illumination while keeping the background peripheral.",
              "Used L02 block instead of L01 per the modification request."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ac6b514c1dfc1c88",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "292f602526f3b49b",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "montage",
        "dependent_scene_index": 80,
        "dependency_reason": "exact_background continuity target from prior S80_Shot14 for the courtyard environment, rendered peripherally due to close framing",
        "_shot_index": 31,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 80,
            "shot_index": 31
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The dolly-in completes at an extreme facial distance after rising from the woman's kneeling level, holding her open mouth and bloodshot eyes near the center while a trace of her contorted shoulders remains along the lower edge. The almost frontal eye-level endpoint turns the transformation into a confrontational image ready for the hard cut.",
            "lighting_mood": "Bright full-moon night light cuts hard across the convulsing face, emphasizing the bloodshot eyes and newly sharpened teeth with stark contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 80,
                "shot_index": 14,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "d6109e61c9ebca58"
      },
      {
        "scene_index": 80,
        "heading": "실내. 어구 창고 - 밤 / 몽타주(회상)",
        "beat_title": "금월도를 점령한 육혈귀 생존자들의 기만적인 섬 상륙",
        "representative_moment": "피로 얼룩진 과거를 숨긴 채 인간의 얼굴로 미소 지으며 해변에 발을 내디딘 육혈귀 생존자들과 그들을 반기는 금월도 원주민들의 섬뜩한 대면 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "slightly below eye level wide composition, bleached colors with soft daylight",
            "t2i_prompt": "Photorealistic cinematic still. Shot from slightly below eye level in a wide composition. A group of historical Korean men and women in ragged traditional clothing stands at three-quarter angle from the left, their leading feet firmly planting onto the sand of the shoreline landing area in the lower-center midground. Their outwardly human faces occupy the upper-middle frame, smiling quietly ominously, their eyes fixed on the welcoming islanders. Farther inland, across the shared sandy beach, a group of Korean island villagers stands with back to camera, leaning forward in welcome, their eyes fixed on the arriving group. Behind the disembarking survivors, the wooden hull of a traditional boat rests at the shore, separated by the daylight sea stretching across the rear of the composition. The scene is bathed in soft daylight with bleached colors, restrained contrast, and muted tones, giving the outwardly natural welcoming moment a quietly ominous, memory-like atmosphere.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: survivors arriving at Geumwol-do by boat",
              "shot description: survivors smiling with outwardly human faces as they step onto the sand",
              "shot description: Geumwol-do villagers welcoming them at the beach"
            ],
            "visual_inferences": [
              "historical Korean clothing reflects the era immediately following the Japanese massacre flashback",
              "wooden boat and traditional attire infer the historical timeline of the survivors' arrival"
            ],
            "creative_decisions": [
              "bleached color palette, muted tones, and soft daylight to reflect the 'memory' perception mode and restrained ominous mood",
              "wide composition from slightly below eye level to geometricallly anchor the leading feet in the lower frame and faces in the upper frame"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "326e9c9d0beb7093",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "31341b63719f6d2f",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 56,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 80,
            "shot_index": 56
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At the end of the backward shoreline track, the camera settles slightly below eye level in a wide composition that favors the survivors' front rank without losing their leading feet planting on the sand. Their outwardly human faces occupy the upper middle of the frame as they smile past the lens toward the waiting islanders, who remain farther inland as a welcoming counter-group.",
            "lighting_mood": "Daylight keeps the welcoming scene outwardly natural while restrained contrast and muted color make the survivors' smiles quietly ominous.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "shoreline landing area",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 80,
                "shot_index": 31,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "138ed0ce655c0fe2"
      },
      {
        "scene_index": 81,
        "heading": "다시 어구 창고 - 밤",
        "beat_title": "믿을 수 없는 진실과 경악",
        "representative_moment": "수리영과 인우가 민숙의 충격적인 고백을 듣고 경악에 차 입을 벌린 채 그녀를 바라본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium eye-level frame, over-the-shoulder composition with hard contrast low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. A medium eye-level frame over the shoulder of an East Asian middle-aged woman, her shoulder and partial profile occupying the left foreground edge, leaning toward the center, sharing the same narrow aisle they all occupy. Facing her from the midground, C01O01 in a casual jacket, an East Asian young woman, stands at a three-quarter angle from the right, leaning back in shock with her mouth open, eyes fixed on the foreground woman. Beside her, C03O04 in fisher workwear, an East Asian young man, stands at a three-quarter angle from the left, shoulders recoiling and mouth open, his eyes also fixed on the foreground woman. The interior is enveloped in low-key ambient night lighting, keeping the faces in hard contrast against profound shadows. A densely stacked fishing net and a gear rack confine the sides of the space, and a closed personnel door is visible in the rear background, all rendered in a restrained palette of blue-black and earthy neutral tones.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "S81 action: Suri-young and In-woo reacting in shock to Min-sook's revelation about being a monster and feeding her Seokchangpo",
              "shot description: over_shoulder from Min-sook's side, catching Suri-young and In-woo head-on but on opposing three-quarter angles, both frozen with open mouths"
            ],
            "visual_inferences": [
              "fixed_element warehouse_night_environment: low-key ambient night lighting, deep shadows, restrained color palette of blue-black and earthy neutrals",
              "Min-sook is unregistered in this scene's ID policy, rendered strictly as an East Asian middle-aged woman to serve as the over-the-shoulder foreground anchor"
            ],
            "creative_decisions": [
              "Used 'sharing the same narrow aisle they all occupy' to explicitly anchor the foreground observer and background subjects in the same physical space",
              "Arranged the fishing net and gear rack to visually compress the sides, enhancing the confined feeling of the warehouse"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cargo door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "anchor",
                "source_phrase": "A densely stacked fishing net"
              },
              {
                "owned_token": "gear locker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gear rack",
                "usage_kind": "anchor",
                "source_phrase": "and a gear rack confine the sides of the space"
              },
              {
                "owned_token": "light fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "personnel door",
                "usage_kind": "anchor",
                "source_phrase": "a closed personnel door is visible in the rear background"
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage bin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "worktable",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "051cda2ae3fa1559",
              "owned_hash": "b4de9b45bb55cede",
              "camera_direction_hash": "f7ef66104fda8ca8",
              "owned_usage_hash": "09749b0bb9ae1aef",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "fishing net",
                  "violating_phrase": "A densely stacked fishing net",
                  "reason": "The prompt mentions the fishing net to anchor the spatial composition of the shot without attempting to redraw or alter the object, aligning with the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "gear rack",
                  "violating_phrase": "and a gear rack confine the sides of the space",
                  "reason": "The prompt mentions the gear rack as a spatial anchor to frame the sides of the shot without dictating a redraw, aligning with the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "personnel door",
                  "violating_phrase": "a closed personnel door is visible in the rear background",
                  "reason": "The prompt points out the personnel door in the background for composition and framing without redrawing it, aligning with the producer's echo.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 81,
            "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 Min-sook's side of the group, a static medium eye-level frame catches Suri-young and In-woo nearly head-on but on opposing three-quarter angles, both frozen with open mouths as they stare toward her. Min-sook's shoulder and partial profile remain at one foreground edge, preserving the conversational axis without stealing focus from the paired reaction.",
            "lighting_mood": "Low-key ambient light appropriate to the night warehouse holds the faces in hard contrast with restrained blue-black, earthy neutral, and deep-red accents.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L41B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench",
              "cargo door",
              "fishing net",
              "gear locker",
              "gear rack",
              "light fixture",
              "personnel door",
              "rope",
              "storage bin",
              "window",
              "worktable"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "warehouse_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the fishing gear warehouse is enveloped in low-key ambient night lighting. The space is filled with deep shadows, characterized by a highly restrained color palette of blue-black and earthy neutral tones.",
                "applies_to_shots": [
                  1,
                  10,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "다시 어구 창고 - 밤",
                  "Low-key ambient light appropriate to the night warehouse",
                  "restrained blue-black, earthy neutral tones"
                ],
                "visual_inferences": [
                  "The warehouse environment is very dim, heavily obscuring background details and keeping the visual focus strictly on the illuminated subjects."
                ],
                "creative_decisions": [
                  "Using profound shadows and a muted blue-black palette to enhance the dramatic and tense atmosphere during the emotional revelation."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L41B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "87e8610fff92de60"
      },
      {
        "scene_index": 81,
        "heading": "다시 어구 창고 - 밤",
        "beat_title": "수리영의 원망과 민숙의 사죄",
        "representative_moment": "C01이 눈물이 고인 채 원망스러운 눈빛으로 민숙을 노려본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight over-the-shoulder close frame at eye level",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a Korean woman in her early 20s, stands in the middle-center midground at a three-quarter angle from the left, looking toward a middle-aged Korean woman at the foreground edge. Captured at C01O01's eye level in a tight close frame, she is held slightly off-center as tears gather on her blood-smeared face, her accusing stare cutting across the shared air between them. The middle-aged woman is seen in an over-the-shoulder perspective with her back to the camera, appearing only as an out-of-focus soft shoulder and partial profile. [: The immediate surroundings are enveloped in low-key ambient night lighting and deep shadows, characterized by a highly restrained color palette of blue-black and earthy neutral tones, with stacked fishing nets forming a soft background surface].",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S81 action: Suri-young sheds tears and glares resentfully at Min-sook.",
              "Shot description: Suri-young with tears in her eyes looks at Min-sook in the dark warehouse."
            ],
            "visual_inferences": [
              "fixed_element warehouse_night_environment: The interior is enveloped in low-key ambient night lighting with deep shadows and earthy neutral tones.",
              "Min-sook is rendered as an out-of-focus foreground shoulder due to the strict close framing constraint."
            ],
            "creative_decisions": [
              "Positioning the camera at C01's eye level to maintain reverse-shot geometry and keep her tearful expression as the sole sharp plane against the soft background."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cargo door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gear locker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gear rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "personnel door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage bin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "worktable",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "10497ee2242db5aa",
              "owned_hash": "b4de9b45bb55cede",
              "camera_direction_hash": "ad07d0b948c159ed",
              "owned_usage_hash": "a8d5d7779607364b",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 81,
        "dependency_reason": "previous_shot_refs requires maintaining the same location and atmosphere as the earlier shot in the scene.",
        "_shot_index": 10,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 81,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At Suri-young's eye level and just inside Min-sook's side of the eyeline, a tight close frame holds Suri-young slightly off-center as tears gather while her accusing stare cuts toward the foreground edge. Min-sook appears only as a soft shoulder and partial profile on that edge, keeping the reverse-shot geometry intact and making Suri-young's expression the sole sharp plane.",
            "lighting_mood": "Low-key warehouse ambience catches the tears and blood against restrained blue-black and earthy neutral tones, with no additional source introduced.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "Min-sook at the foreground edge",
                  "label": "김지후(강수리영)",
                  "screen_zone": "middle_center",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L41B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "warehouse_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the fishing gear warehouse is enveloped in low-key ambient night lighting. The space is filled with deep shadows, characterized by a highly restrained color palette of blue-black and earthy neutral tones.",
                "applies_to_shots": [
                  1,
                  10,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "다시 어구 창고 - 밤",
                  "Low-key ambient light appropriate to the night warehouse",
                  "restrained blue-black, earthy neutral tones"
                ],
                "visual_inferences": [
                  "The warehouse environment is very dim, heavily obscuring background details and keeping the visual focus strictly on the illuminated subjects."
                ],
                "creative_decisions": [
                  "Using profound shadows and a muted blue-black palette to enhance the dramatic and tense atmosphere during the emotional revelation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 81,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "c698531c3865db48"
      },
      {
        "scene_index": 81,
        "heading": "83. 다시 어구 창고 - 밤",
        "beat_title": "민숙의 오열과 사과",
        "representative_moment": "민숙(C04)이 죄책감에 고개를 푹 떨군 채 눈물을 뚝뚝 흘리는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing, eye-level tilted subtly downward, low-key night illumination",
            "t2i_prompt": "Photorealistic cinematic still. C04O05 in a dark coat, a Korean middle-aged woman, positioned at three-quarter angle from the right. Framed closely at eye level tilting subtly downward, her head is collapsed into the lower middle of the frame, looking down with a distorted expression of sorrow. Her shoulders fill the left and right side boundaries of the image. Falling tears catch the low-key ambient night illumination. The immediate surroundings behind her fade into a soft, out-of-focus compressed texture enveloped in deep shadows, utilizing a restrained palette of blue-black and earthy neutral tones to keep the visual focus strictly on her illuminated face.",
            "outfit_assignments": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "어흑- 오열하며 도저히 울음을 삼킬 수가 없다",
              "어깨를 들썩이며 우는 엄마",
              "The reverse close position stays at Min-sook's eye level, then tilts subtly downward with her as her head collapses and tears fall",
              "Her distorted face settles in the lower middle of the frame while her shaking shoulders form the side boundaries"
            ],
            "visual_inferences": [
              "fixed_element warehouse_night_environment: heavily obscuring background details and keeping the visual focus strictly on the illuminated subjects",
              "Tears catching the dim ambient light to highlight her raw emotional breakdown"
            ],
            "creative_decisions": [
              "Skipped background reference due to close framing, instead using a soft compressed texture with blue-black tones to isolate her figure",
              "Using the shoulders as physical frame boundaries to heighten the claustrophobic and intense feeling of her guilt"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cargo door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gear locker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gear rack",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "light fixture",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "personnel door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage bin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "worktable",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "3c994a265cdfe8c5",
              "owned_hash": "b4de9b45bb55cede",
              "camera_direction_hash": "0c265cf8ee51b42f",
              "owned_usage_hash": "a8d5d7779607364b",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 81,
        "dependency_reason": "Same environment (warehouse_night_environment fixed_element), continuing the emotional confrontation under the same lighting.",
        "_shot_index": 12,
        "visible_entities": [
          "C04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 81,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The reverse close position stays at Min-sook's eye level, then tilts subtly downward with her as her head collapses and tears fall. Her distorted face settles in the lower middle of the frame while her shaking shoulders form the side boundaries, leaving Suri-young outside the image but preserving her eyeline direction.",
            "lighting_mood": "Low-key ambient illumination lets the falling tears catch against the otherwise dark, restrained warehouse palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L41B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "warehouse_night_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the fishing gear warehouse is enveloped in low-key ambient night lighting. The space is filled with deep shadows, characterized by a highly restrained color palette of blue-black and earthy neutral tones.",
                "applies_to_shots": [
                  1,
                  10,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "다시 어구 창고 - 밤",
                  "Low-key ambient light appropriate to the night warehouse",
                  "restrained blue-black, earthy neutral tones"
                ],
                "visual_inferences": [
                  "The warehouse environment is very dim, heavily obscuring background details and keeping the visual focus strictly on the illuminated subjects."
                ],
                "creative_decisions": [
                  "Using profound shadows and a muted blue-black palette to enhance the dramatic and tense atmosphere during the emotional revelation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 81,
                "shot_index": 10,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "e64222f1de7b0310"
      },
      {
        "scene_index": 82,
        "heading": "실외. 금월도 일각 - 새벽/ 아침",
        "beat_title": "새로운 운명의 아침을 알리는 붉은 일출",
        "representative_moment": "어두운 바다의 수평선 위로 붉은 태양이 눈부시게 솟아오르는 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "distant axis over the sea with a slight upward tilt, restrained high-contrast lighting",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from a distant axis over the sea, the camera settles into an expansive frame just above the faintly visible horizon. A deep red sun clears the water, remaining a compact focal point in the upper-middle area rather than overwhelming the view. The vast horizon and broad dark sea occupy the lower field, retaining most of the composition. The lighting captures dawn shifting from dim ambient shadow into the intense red glow of the rising sun, forming a restrained, high-contrast seascape where the dark ripples catch faint crimson reflections.",
            "outfit_assignments": [],
            "source_facts": [
              "scene text: '금월도 앞바다에 어슴프레 여명이 밝아오는가 싶더니… 붉은 빛이 드리우고 해가 뜨기 시작한다. 그렇게 새 날이 밝아온다.'",
              "shot description: 바다 위로 붉은 태양이 눈부시게 솟아오른 찰나의 전경"
            ],
            "visual_inferences": [
              "the dark waters contrast sharply with the intense red of the sun",
              "the horizon divides the frame stably, emphasizing the vastness of the sea"
            ],
            "creative_decisions": [
              "placed the compact red sun in the upper-middle area to maintain a wide, vast seascape composition",
              "applied a restrained high-contrast lighting mood to preserve the somber, suspenseful tone of the thriller genre even at sunrise"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c5b755e548bc0cc3",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "039ba1a94354da73",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 82,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the same distant axis over the sea, the upward tilt settles into a wide frame just above the horizon as the red sun clears the water. The sun remains a compact focal point in the upper-middle area rather than overwhelming the view, with the horizon and broad sea retaining most of the composition.",
            "lighting_mood": "Dawn shifts from dim ambient light into the explicitly described red glow of the rising sun, held in a restrained high-contrast seascape.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "91582d5fe581065a"
      },
      {
        "scene_index": 83,
        "heading": "실내. 반월 식당 - 낮",
        "beat_title": "절망 속에서도 꺾이지 않는 영란의 집착과 산들의 무거운 긴장",
        "representative_moment": "산들이 문가에 서서 묵묵히 내려다보는 가운데, 영란이 테이블에 엎드릴 듯 몸을 기울인 채 허공을 노려본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "seated-eye-level medium frame, side profile composition, low-key restrained daytime contrast",
            "t2i_prompt": "Photorealistic cinematic still. An Asian man in dark island workwear stands in right profile in the midground, looking down across the restaurant table in the lower-center midground at an older Asian woman with white hair seated at three-quarter angle from the left. His weight is braced near the doorway threshold, while she leans over the table, maintaining a rigid, severe facial expression with her eyes fixed intensely off-screen into empty space, conveying a cold and venomous focus without breaking her stare. Natural daytime lighting inside the restaurant interior is shaped into a restrained, low-key contrast with neutral tones, keeping the man sober and the woman colder within the same frame, while the window and open doorway behind the man provide an unobstructed view toward the sea side outside.",
            "outfit_assignments": [],
            "source_facts": [
              "Sandeul standing at the doorway, looking down at Yeongran",
              "Yeongran seated at the table, looking out",
              "Natural daytime illumination appropriate to the restaurant is shaped into restrained contrast"
            ],
            "visual_inferences": [
              "The ambient daylight provides consistent neutral tones without harsh, overly bright directional shadows in the room.",
              "Her facial muscles are visibly tense, emphasizing a completely immobilized and resolute stare."
            ],
            "creative_decisions": [
              "Using a seated-eye-level medium frame to clearly establish their vertical power relation without changing the eyeline.",
              "Anchoring both characters across the restaurant table to emphasize their spatial tension and shared isolation."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cargo door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "loading dock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage bin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "while the window and open doorway behind the man provide an unobstructed view"
              },
              {
                "owned_token": "worktable",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c96fbba6a3bc1a3e",
              "owned_hash": "e3b06e48207282c3",
              "camera_direction_hash": "01cc389544a346ed",
              "owned_usage_hash": "bf7c345d277e6abc",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "window",
                  "violating_phrase": "the window and open doorway behind the man provide an unobstructed view",
                  "reason": "The window is mentioned only as a background anchor behind the character to provide an outward view, which is consistent with the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 81,
        "dependency_reason": "Same restaurant interior location, carrying over the background structure and atmosphere.",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 83,
            "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 the seated-eye-level position beside Sandeul, the static medium frame views him in strict side profile as he looks down toward Yeongran at the table. Sandeul occupies one midground side with his weight held near the doorway, while Yeongran sits lower on the opposite side, keeping their vertical power relation legible without changing the established eyeline.",
            "lighting_mood": "Natural daytime illumination appropriate to the restaurant is shaped into restrained contrast, keeping Sandeul sober and Yeongran colder within the same frame.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "restaurant table",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L41B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench",
              "cargo door",
              "fishing net",
              "loading dock",
              "rope",
              "storage bin",
              "warehouse",
              "window",
              "worktable"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_daylight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Natural daytime lighting inside the restaurant interior. The illumination is held in a restrained, low-key contrast with neutral tones, maintaining a consistently cold and sober atmosphere across the physical space.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime illumination appropriate to the restaurant is shaped into restrained contrast",
                  "Natural daytime light is held in low-key contrast"
                ],
                "visual_inferences": [
                  "The ambient daylight provides consistent neutral tones without harsh, overly bright directional shadows in the room."
                ],
                "creative_decisions": [
                  "Using restrained and cold lighting to reflect the severe and tense mood of the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "yeongran_severe_expression",
                "element_type": "character_state",
                "character_name": "강영란(흰 머리 여자)",
                "description": "The localized facial state of an older Asian woman with white hair. She maintains a rigid, severe facial expression with her eyes fixed intensely off-screen into empty space, conveying a cold and venomous focus without breaking her stare.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "close",
                "source_facts": [
                  "강영란(흰 머리 여자)",
                  "gaze=off_screen",
                  "eyes fixed beyond the camera into empty space",
                  "fixed eyes feel cold and venomous"
                ],
                "visual_inferences": [
                  "Her facial muscles are visibly tense, emphasizing a completely immobilized and resolute stare."
                ],
                "creative_decisions": [
                  "Isolating her unwavering gaze as a localized detail to highlight her chilling determination regardless of the camera's distance."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 81,
                "shot_index": 12,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L41B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "b233d8e9b123e73e"
      },
      {
        "scene_index": 83,
        "heading": "실내. 반월 식당 - 낮",
        "beat_title": "강영란의 서늘한 결의",
        "representative_moment": "An older Asian woman with white hair sits at a table in a tight close-up, her cold eyes fixed intensely off-screen.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight facial close-up, severe three-quarter angle, shallow depth of field, restrained neutral lighting",
            "t2i_prompt": "Photorealistic cinematic still. An older Asian woman with white hair in a tight facial composition, her face slightly off-center at a severe three-quarter angle from the right. She maintains a rigid, severe facial expression, her eyes fixed intensely off-screen into empty space with a cold, venomous focus. A narrow strip of a table crosses the lower frame edge at a slight angle, serving as a spatial anchor below her. In the soft, out-of-focus background, an interior opening reveals a distant exterior and the blurred motion of passing figures. Natural daytime illumination casts a restrained, low-key contrast across her face, emphasizing the cold and sober atmosphere through muted neutral tones.",
            "outfit_assignments": [],
            "source_facts": [
              "강영란(흰 머리 여자)",
              "gaze=off_screen",
              "eyes fixed beyond the camera into empty space",
              "Natural daytime illumination appropriate to the restaurant is shaped into restrained contrast",
              "passing villagers are visible beyond the interior opening"
            ],
            "visual_inferences": [
              "fixed_element yeongran_severe_expression: older Asian woman with white hair, rigid facial expression, venomous focus",
              "fixed_element restaurant_daylight_environment: low-key contrast with neutral tones, consistently cold and sober atmosphere",
              "shallow depth of field rendering the background figures softly out of focus due to the tight framing on the face"
            ],
            "creative_decisions": [
              "Placing the table as a narrow lower-frame edge anchor to ground the tight composition geometrically without distracting from the severe expression.",
              "Highlighting the rigid, unblinking stare by rendering the background elements out-of-focus, matching the isolated obsession of the character."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cargo door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "loading dock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage bin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "worktable",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "fdb3512b5359637d",
              "owned_hash": "e3b06e48207282c3",
              "camera_direction_hash": "37488ed09246a2db",
              "owned_usage_hash": "bdec5eb1eb936cb2",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 83,
        "dependency_reason": "continuous daylight and same physical environment as previous shots in scene 83",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 83,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The advance along Sandeul's former eyeline ends across the table at Yeongran's eye level in a tight facial composition. Her face sits slightly off-center on a severe three-quarter angle, eyes fixed beyond the camera into empty space, while only a narrow strip of table remains below as spatial evidence.",
            "lighting_mood": "Natural daytime light is held in low-key contrast across Yeongran's face, with restrained neutrals making her fixed eyes feel cold and venomous.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L41B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_daylight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Natural daytime lighting inside the restaurant interior. The illumination is held in a restrained, low-key contrast with neutral tones, maintaining a consistently cold and sober atmosphere across the physical space.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime illumination appropriate to the restaurant is shaped into restrained contrast",
                  "Natural daytime light is held in low-key contrast"
                ],
                "visual_inferences": [
                  "The ambient daylight provides consistent neutral tones without harsh, overly bright directional shadows in the room."
                ],
                "creative_decisions": [
                  "Using restrained and cold lighting to reflect the severe and tense mood of the scene."
                ],
                "confidence": "high"
              },
              {
                "element_id": "yeongran_severe_expression",
                "element_type": "character_state",
                "character_name": "강영란(흰 머리 여자)",
                "description": "The localized facial state of an older Asian woman with white hair. She maintains a rigid, severe facial expression with her eyes fixed intensely off-screen into empty space, conveying a cold and venomous focus without breaking her stare.",
                "applies_to_shots": [
                  4,
                  5
                ],
                "element_scope": "close",
                "source_facts": [
                  "강영란(흰 머리 여자)",
                  "gaze=off_screen",
                  "eyes fixed beyond the camera into empty space",
                  "fixed eyes feel cold and venomous"
                ],
                "visual_inferences": [
                  "Her facial muscles are visibly tense, emphasizing a completely immobilized and resolute stare."
                ],
                "creative_decisions": [
                  "Isolating her unwavering gaze as a localized detail to highlight her chilling determination regardless of the camera's distance."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 83,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "d0845f387c2c1d97"
      },
      {
        "scene_index": 84,
        "heading": "86. 다시 어구 창고 - 낮",
        "beat_title": "창밖을 예의주시하는 뒷모습",
        "representative_moment": "먼지가 잔뜩 낀 창문 너머로 선착장을 내다보는 아시안 중년 여성의 뒷모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Shoulder height medium frame from directly behind",
            "t2i_prompt": "Photorealistic cinematic still. An Asian middle-aged woman in a dark jacket stands with her back to the camera in the middle-left frame, leaning closely toward the dusty window and dock beyond in the upper-right background. Viewed from directly behind at shoulder height in a medium frame, her back aligns with the heavily obscured glass. She gazes off-screen through the thick layer of dirt, the exterior dock only indistinctly visible receding into the distance. Subdued daylight filters through the heavy dust on the window, outlining her back in muted, low-contrast tones and creating a soft, diffused lighting that unifies the cramped indoor space. Densely stacked fishing gear flanks her silhouette from both sides, facing inward toward the window axis, preserving the dim, shadowy atmosphere of the storage warehouse interior.",
            "outfit_assignments": [],
            "source_facts": [
              "먼지가 잔뜩 껴서 흐릿한 창 밖으로 바깥 선착장 쪽 동태를 살피는 민숙",
              "Daylight filtering through the dusty window",
              "강민숙: back_to_camera, leaning closely toward window, gaze=off_screen, state=alive"
            ],
            "visual_inferences": [
              "fixed_element dusty_warehouse_lighting: The ambient light is soft and heavily diffused due to the thick layer of dirt and dust on the glass",
              "Densely stacked fishing gear frames her silhouette from both sides to emphasize the cramped hiding place"
            ],
            "creative_decisions": [
              "Shoulder-height camera angle directly behind the subject to align her sightline with the obscured window",
              "Muted, low-contrast tones to highlight the dusty atmosphere and tense isolation of the warehouse interior"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "9ab77ebd9234cc19",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "9d7bc90edfb6d82f",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on prior scenes.",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 84,
            "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 directly behind Min-sook at shoulder height, a static medium frame aligns her back with the dusty, obscured window as she leans forward to inspect the dock. She occupies the middle-left portion while the window spans the upper center and right, allowing a limited view of the dock through the dust without revealing the two companions behind her.",
            "lighting_mood": "Daylight filtering through the dusty window outlines Min-sook's back in muted, low-contrast tones while the storage interior remains subdued.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "looks_to_anchor",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "dusty window and dock beyond",
                  "screen_zone": "upper_right",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusty_warehouse_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The warehouse interior is illuminated by subdued daylight filtering through heavy dust on the windows. This creates a muted, low-contrast atmosphere with soft, diffused lighting that unifies the indoor space.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Daylight filtering through the dusty window",
                  "Daylight filtered through the dusty warehouse window",
                  "먼지가 잔뜩 껴서 흐릿한 창"
                ],
                "visual_inferences": [
                  "The ambient light is soft and heavily diffused due to the thick layer of dirt and dust on the glass",
                  "The overall interior has a dim, shadowy appearance contrasting with the outside daylight"
                ],
                "creative_decisions": [
                  "Keeping a consistent muted and gritty lighting tone across all angles within the storage warehouse to maintain tension"
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "ae41d38099e29ea5"
      },
      {
        "scene_index": 84,
        "heading": "86. 다시 어구 창고 - 낮",
        "beat_title": "The last resort revealed",
        "representative_moment": "A hand suddenly pulls a .38-caliber handgun out of an open backpack.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height close framing with centered focus on the weapon, soft out-of-focus background, subdued dusty daylight",
            "t2i_prompt": "Photorealistic cinematic still. Captured from waist height, the composition focuses strictly on a sharp mid-action moment. In the exact frame center, a hand firmly grips a .38-caliber handgun, the weapon's side profile clearly visible as it rises sharply. Below, an open backpack occupies the lower third of the frame, its opening facing the camera. Along the upper edge, the bent torso of an Asian man in his 30s is partially visible, angled at three-quarter right, looking down at the bag. The immediate surroundings are soft and out of focus. Subdued daylight filters through heavy dust, casting soft, diffused, low-contrast lighting over the hand and the metallic surface of the weapon.",
            "outfit_assignments": [],
            "source_facts": [
              "주저하던 인우가 백팩에서 불쑥 38구경 권총 하나를 끄집어낸다."
            ],
            "visual_inferences": [
              "fixed_element dusty_warehouse_lighting: subdued daylight filtering through heavy dust, muted low-contrast atmosphere",
              "Torso visible at the top edge and backpack at the bottom edge geometrically aligns with a waist-height camera position"
            ],
            "creative_decisions": [
              "Framed to emphasize the weapon reveal by keeping the background soft and placing the handgun exactly in the center, conveying the sharp vertical jolt of the action",
              "Restrained contrast lighting keeps the mood tense without introducing new light sources"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "4e22522c6df8a086",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "1917957ea4e3172d",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 84,
        "dependency_reason": "Preserving the same dusty warehouse lighting and room atmosphere",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 84,
            "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 waist height beside 정인우, the final dolly-in settles into a tight close-up as the .38-caliber handgun clears the backpack opening, with the weapon and his gripping hand centered while his bent torso remains along the upper edge for scale. The backpack occupies the lower third, and the sudden upward pull of his arm gives the otherwise controlled frame a sharp vertical jolt.",
            "lighting_mood": "Daylight filtered through the dusty warehouse window is held in restrained contrast, keeping the weapon reveal stark without introducing another light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dusty_warehouse_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The warehouse interior is illuminated by subdued daylight filtering through heavy dust on the windows. This creates a muted, low-contrast atmosphere with soft, diffused lighting that unifies the indoor space.",
                "applies_to_shots": [
                  1,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "Daylight filtering through the dusty window",
                  "Daylight filtered through the dusty warehouse window",
                  "먼지가 잔뜩 껴서 흐릿한 창"
                ],
                "visual_inferences": [
                  "The ambient light is soft and heavily diffused due to the thick layer of dirt and dust on the glass",
                  "The overall interior has a dim, shadowy appearance contrasting with the outside daylight"
                ],
                "creative_decisions": [
                  "Keeping a consistent muted and gritty lighting tone across all angles within the storage warehouse to maintain tension"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 84,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "225ef97d11bde6d8"
      },
      {
        "scene_index": 85,
        "heading": "실외. 마을 일각 - 낮",
        "beat_title": "고산들의 강한 의심",
        "representative_moment": "고산들(C08)이 굳은 표정으로 시선을 어구 창고 쪽으로 고정한 채 서 있는 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "firm static close-up with shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. C08O11 in a dark jacket, an Asian middle-aged man with short black hair and an angular face, seen in three-quarter left profile, neck craned as his sharp eyes fix intensely off-screen to the left. The camera holds a firm static close-up at his face height, capturing his rigid jaw and narrowed eyes. His face is weighted slightly to the right side of the frame, leaving the opposite frame edge open toward his off-screen sightline. Bright daytime sunlight provides crisp cinematic illumination with firm facial contrast and distinct shadows. The background is a soft, out-of-focus daylight outdoor environment in an earthy-neutral palette, rendering any distant structures completely blurred.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "S87 action: 산들은 그래도 뭔가가 걸리는 지 어구 창고 쪽을 주시하는데…",
              "shot description: 어구 창고 쪽을 향해 예리한 시선을 고정한 고산들의 굳은 얼굴 클로즈업",
              "time: daytime"
            ],
            "visual_inferences": [
              "fixed_element daytime_natural_lighting: crisp daylight contrast and distinct natural shadows",
              "shallow background to emphasize his rigid jaw and prevent the unseen target from being resolved"
            ],
            "creative_decisions": [
              "close framing isolating his expression and building suspense",
              "earthy-neutral color palette keeping the tone grounded and serious"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "buoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floodlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gear shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "patrol boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "05b42bf1483cf155",
              "owned_hash": "fa95f9432131c21c",
              "camera_direction_hash": "e754a336a0f41464",
              "owned_usage_hash": "be8fecdab71d84cb",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "This close-up focuses entirely on C08's expression and reaction, standing independent of specific prior scene background visuals due to shallow depth of field.",
        "_shot_index": 4,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 85,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 고산들's face height and just off his eyeline, hold a firm static close-up with his face weighted slightly to one side and the warehouse direction left beyond the opposite frame edge. His rigid jaw and narrowed eyes carry the entire composition, while the shallow background prevents the unseen target of his suspicion from being visually resolved.",
            "lighting_mood": "Natural daytime illumination is shaped into firm facial contrast while retaining a restrained, earthy-neutral palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L18B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_natural_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor environment is bathed in bright, natural daytime sunlight. The clear daylight provides high visibility and crisp cinematic contrast, casting distinct natural shadows and maintaining a consistent atmosphere across both the island landscape and the surrounding sea.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime illumination",
                  "Bright daytime sunlight breaks across the blue sea"
                ],
                "visual_inferences": [
                  "The weather is clear, providing a consistent daylight setting that unifies the village edge and the adjacent open sea."
                ],
                "creative_decisions": [
                  "Using crisp daylight contrast to heighten the tension of the scene, stripping away any hiding spots in the broad daylight."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 25,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "3d6e459a378f77c6"
      },
      {
        "scene_index": 85,
        "heading": "실외. 마을 일각 - 낮",
        "beat_title": "경찰 순찰정의 접근",
        "representative_moment": "A patrol boat rapidly approaches the island pier across the sunlit sea.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Wide moving frame from near water level, capturing dynamic diagonal motion with bright cinematic contrast.",
            "t2i_prompt": "Photorealistic cinematic still. Observed from near water level, the camera tracks the patrol boat as it cuts rapidly across the broad blue sea, holding its raised bow positioned in the upper-middle frame. The forward quarter of the patrol boat angles diagonally toward the observer. A forceful white spray rises from the hull, and a trailing diagonal wake stretches behind the vessel. Bright daytime sunlight breaks across the rolling water surface and the spray, providing high visibility and crisp cinematic contrast. In the distance, the pier is visible along the coast. The wide environmental field of the open sea surrounds the vessel.",
            "outfit_assignments": [],
            "source_facts": [
              "A police patrol boat approaches the pier from the sea at high speed",
              "The outdoor environment is bathed in bright, natural daytime sunlight",
              "Track parallel from near water level, offset ahead of the patrol boat's forward quarter"
            ],
            "visual_inferences": [
              "The boat creates a forceful white wake and spray due to its rapid speed",
              "The pier is visible in the distant background, establishing the destination of the patrol boat"
            ],
            "creative_decisions": [
              "Positioned the raised bow in the upper-middle frame to convey the boat's dynamic motion",
              "Used a near water level angle to emphasize the speed and the forceful wake trailing diagonally behind the vessel without using forbidden temporal words"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "buoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floodlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gear shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "patrol boat",
                "usage_kind": "anchor",
                "source_phrase": "the camera tracks the patrol boat as it cuts rapidly across the broad blue sea, holding its raised bow positioned in the upper-middle frame"
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "the pier is visible along the coast"
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f37d29604891a7b2",
              "owned_hash": "fa95f9432131c21c",
              "camera_direction_hash": "af96c381277572d3",
              "owned_usage_hash": "07a3b53cbc05a255",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "patrol boat",
                  "violating_phrase": "the camera tracks the patrol boat as it cuts rapidly across the broad blue sea, holding its raised bow positioned in the upper-middle frame",
                  "reason": "The prompt mentions the patrol boat to establish camera tracking, composition, and movement without modifying its physical design, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pier",
                  "violating_phrase": "the pier is visible along the coast",
                  "reason": "The prompt refers to the pier purely as a distant background landmark along the coast, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 22,
        "dependency_reason": "Exact background location referencing the sea and pier from Scene 22",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 85,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track parallel from near water level, offset ahead of the patrol boat's forward quarter, holding the raised bow in the upper-middle of a wide moving frame and the forceful wake trailing diagonally behind it. The sea remains broad enough around the vessel to communicate speed and destination rather than turning the boat into an isolated object study.",
            "lighting_mood": "Bright daytime sunlight breaks across the blue sea and white spray, tempered by crisp cinematic contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "buoy",
              "crate",
              "fishing boat",
              "fishing net",
              "floodlight",
              "gear shed",
              "patrol boat",
              "pier",
              "rope"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_natural_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor environment is bathed in bright, natural daytime sunlight. The clear daylight provides high visibility and crisp cinematic contrast, casting distinct natural shadows and maintaining a consistent atmosphere across both the island landscape and the surrounding sea.",
                "applies_to_shots": [
                  4,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime illumination",
                  "Bright daytime sunlight breaks across the blue sea"
                ],
                "visual_inferences": [
                  "The weather is clear, providing a consistent daylight setting that unifies the village edge and the adjacent open sea."
                ],
                "creative_decisions": [
                  "Using crisp daylight contrast to heighten the tension of the scene, stripping away any hiding spots in the broad daylight."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 22,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L18B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "c708a6a8efcdbf11"
      },
      {
        "scene_index": 86,
        "heading": "Scene 88. Outdoor. Dock - Day",
        "beat_title": "Emergency Boarding of the Patrol Boat",
        "representative_moment": "C03 pulls C01 and C04 up onto the patrol boat deck as they reach from below.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight medium view, downward crane angle from deck height, firm contrast daylight",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from just outside the patrol boat at deck height with a downward angle, the composition captures a tight medium view. C03O04 in a fishing jacket, a Korean mid-20s man, stands in left profile with knees bent on the deck, gazing down. He exerts force, hauling upward against the bright natural daytime sunlight. The outer edge of the patrol boat cuts horizontally behind his forearms, preserving the difference in elevation. Below the edge, C01O01 in a casual outfit, a Korean early-20s woman, leans at three-quarter angle from the right, reaching upward mid-climb with her eyes fixed on C03O04. Beside her, C04O05 in outdoor wear, a Korean late-40s woman, pushes upward at three-quarter angle from the left, gazing up and reaching toward his grip. His locked grips form a tense central triangle with their outstretched arms. The bright natural daylight provides clear visibility and firm contrast across the strained limbs.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "source_facts": [
              "Inwoo (C03) reaches his hand out to pull Suriyoung (C01) and Minsook (C04) onto the boat.",
              "Natural daytime light keeps the interlocked hands and strained arms clearly modeled with firm contrast.",
              "The scene is illuminated by bright, natural daytime sunlight."
            ],
            "visual_inferences": [
              "fixed_element natural_daytime_lighting keeps the daylight atmosphere consistent across the pier and deck.",
              "The difference in elevation highlights the desperate nature of the boarding, forming a tense central triangle of arms."
            ],
            "creative_decisions": [
              "Positioned the camera just outside the patrol boat at deck height to place the deck edge directly behind C03's forearms, clearly dividing the upper and lower elevations.",
              "Used a downward crane angle to emphasize C03's vantage point and the women's struggle to climb up."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "handcart",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pallet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "patrol boat",
                "usage_kind": "anchor",
                "source_phrase": "The outer edge of the patrol boat cuts horizontally behind his forearms"
              },
              {
                "owned_token": "security light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "83c068af31564857",
              "owned_hash": "6870c7f4a8d8ab4d",
              "camera_direction_hash": "298cbcb79b679f8d",
              "owned_usage_hash": "2456e337de6dfaa6",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "patrol boat",
                  "violating_phrase": "The outer edge of the patrol boat cuts horizontally behind his forearms",
                  "reason": "The patrol boat is used as a camera placement reference and compositional boundary without any instructions to redraw or alter it, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 81,
        "dependency_reason": "Maintains exact background consistency for the dock location and the patrol boat setting established in Scene 81.",
        "_shot_index": 7,
        "visible_entities": [
          "C01",
          "C03",
          "C04"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 86,
            "shot_index": 7
          },
          "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 patrol boat at deck height, crane with a downward angle into a tight medium view of 정인우 bracing above while both women reach up from below. His two locked grips form a tense central triangle with their outstretched arms, while the deck edge cuts horizontally behind his forearms and preserves the difference in elevation.",
            "lighting_mood": "Natural daytime light keeps the interlocked hands and strained arms clearly modeled with firm contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "C04"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              },
              {
                "character_id": "C03",
                "outlook_id": "O04"
              },
              {
                "character_id": "C04",
                "outlook_id": "O05"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L41B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "crate",
              "dock",
              "fender",
              "fishing net",
              "gangway",
              "handcart",
              "life ring",
              "mooring rope",
              "pallet",
              "patrol boat",
              "security light",
              "warehouse"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "natural_daytime_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene is illuminated by bright, natural daytime sunlight. The outdoor lighting provides clear visibility and firm contrast across the environment, maintaining a consistent daytime atmosphere for both the deck and the inland area.",
                "applies_to_shots": [
                  7,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime light keeps the interlocked hands and strained arms clearly modeled with firm contrast.",
                  "Natural daylight is rendered with hard dramatic separation between the charging figure and the receding background."
                ],
                "visual_inferences": [
                  "The sun acts as the primary broad light source, creating consistent daylight conditions across the entire coastal pier setting."
                ],
                "creative_decisions": [
                  "Emphasize the harsh, exposing quality of the natural daylight to heighten the raw intensity and dramatic tension of the frantic escape and pursuit."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 81,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C03O04",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C04O05",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L41B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "03587669fa998db9"
      },
      {
        "scene_index": 86,
        "heading": "실외. 선착장 - 낮",
        "beat_title": "짐승 같은 맹렬한 추격과 죽음",
        "representative_moment": "A charging young man sprints forward like a beast while a dead detective lies sprawled in the background.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "low observer wide shot, hard dramatic contrast",
            "t2i_prompt": "Photorealistic cinematic still. From a low observer position at ground level, an Asian young man in rugged clothes, facing the camera, lunging forward mid-stride with his torso pitched like a charging animal, one foot driven forward, gaze off-screen, his full body centered with shoes and lower legs occupying the lower frame. Far behind him on the same cement dock they both occupy, an Asian middle-aged man in a detective jacket lies motionless in the inland background, sprawled with a twisted neck at a three-quarter angle from the right, gaze off-screen. The length of the dock recedes behind the charging man toward a distant warehouse on the inland side. Bright natural daytime sunlight provides clear visibility and firm contrast, establishing a hard dramatic separation between the sprinting foreground figure and the receding inland background.",
            "outfit_assignments": [],
            "source_facts": [
              "S86 action: 고산들 lunging forward mid-stride like a charging animal.",
              "S86 action: 조 형사 sprawled on the ground, dead with a twisted neck."
            ],
            "visual_inferences": [
              "fixed_element natural_daytime_lighting: bright sunlight casts hard dramatic separation between the charging figure and the background.",
              "A low camera angle requires shoes and lower legs to occupy the lower frame, emphasizing the forward lunge."
            ],
            "creative_decisions": [
              "Wide framing captures the full body of the sprinting man in the foreground while placing the lifeless detective in the distant background.",
              "Explicitly used 'the same cement dock they both occupy' to anchor the foreground and background figures in a unified physical space."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dock",
                "usage_kind": "anchor",
                "source_phrase": "on the same cement dock they both occupy"
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "handcart",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pallet",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "patrol boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "security light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "anchor",
                "source_phrase": "toward a distant warehouse on the inland side"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a6965ada0004a9d3",
              "owned_hash": "6870c7f4a8d8ab4d",
              "camera_direction_hash": "0947fb50210f047d",
              "owned_usage_hash": "a2c75930a720f813",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "dock",
                  "violating_phrase": "on the same cement dock they both occupy",
                  "reason": "The prompt mentions the dock as an existing ground surface that characters occupy and which recedes in depth, aligning with the anchor classification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "warehouse",
                  "violating_phrase": "toward a distant warehouse on the inland side",
                  "reason": "The warehouse is mentioned as a distant background point of reference for the receding dock, which acts as an anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 83,
        "dependency_reason": "같은 장소(금월도 선착장)의 배경 연속성 유지 및 이전 샷에서의 공간적 연결",
        "_shot_index": 12,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 86,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From a low position ahead of 고산들, track backward toward the patrol boat while holding his full body in the center as he drives one foot forward with his torso pitched like a charging animal. 조 형사's sprawled body remains smaller in the inland background, receding along the same pursuit axis without distracting from 고산들's accelerating stride.",
            "lighting_mood": "Natural daylight is rendered with hard dramatic separation between the charging figure and the receding background.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L41B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "crate",
              "dock",
              "fender",
              "fishing net",
              "gangway",
              "handcart",
              "life ring",
              "mooring rope",
              "pallet",
              "patrol boat",
              "security light",
              "warehouse"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "natural_daytime_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene is illuminated by bright, natural daytime sunlight. The outdoor lighting provides clear visibility and firm contrast across the environment, maintaining a consistent daytime atmosphere for both the deck and the inland area.",
                "applies_to_shots": [
                  7,
                  12
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime light keeps the interlocked hands and strained arms clearly modeled with firm contrast.",
                  "Natural daylight is rendered with hard dramatic separation between the charging figure and the receding background."
                ],
                "visual_inferences": [
                  "The sun acts as the primary broad light source, creating consistent daylight conditions across the entire coastal pier setting."
                ],
                "creative_decisions": [
                  "Emphasize the harsh, exposing quality of the natural daylight to heighten the raw intensity and dramatic tension of the frantic escape and pursuit."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 83,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L41B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "42accbec9a573da8"
      },
      {
        "scene_index": 87,
        "heading": "89. 경찰 순찰정 - 계속",
        "beat_title": "민숙의 방어와 수리영의 절망",
        "representative_moment": "강민숙 stands firm as a human barrier on the boat deck, protecting a tearful 김지후 behind her.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Directly behind the foreground character at shoulder height, static medium frame with high-contrast natural daylight",
            "t2i_prompt": "Photorealistic cinematic still. Shot from directly behind an East Asian middle-aged woman at shoulder height, positioned with her back to the camera across the central foreground as a human barrier, feet planted, shoulders squared, and looking off-screen. She occupies the same deck space as a young East Asian woman, who is visible in the stern area beyond one shoulder, huddled low on the deck at three-quarter angle from the left, looking up. The young woman's face is noticeably damp and continuously streaked with fresh tears. High-contrast natural daytime light emphasizes the blocking silhouette in the foreground and the young woman's expression. [L38: The exterior deck of a moving police patrol boat surrounded by the open sea, featuring metal guardrails along the edges and a passage receding away.]",
            "outfit_assignments": [],
            "source_facts": [
              "경찰 순찰정 외부 및 갑판",
              "순찰정 난간",
              "울먹이는 김지후",
              "절망적으로 오열하는 김지후",
              "이들 사이를 막아서는… 민숙.",
              "태워버릴 듯 산들을 노려본다."
            ],
            "visual_inferences": [
              "fixed_element patrol_boat_deck_daytime: The setting is the exterior deck of a moving police patrol boat bathed in stark daylight.",
              "fixed_element kim_jihoo_tearful_face: The young woman's face is noticeably damp and continuously streaked with fresh tears.",
              "The foreground character acts as a solid physical barrier, holding a defensive stance with planted feet."
            ],
            "creative_decisions": [
              "Observer POV at shoulder height directly behind the middle-aged woman to physically block the frame and protect the character in the background.",
              "Using high-contrast daylight to sharply define the foreground silhouette while highlighting the moisture on the crying face.",
              "Implemented shared space anchor ('occupies the same deck space') to ensure correct foreground/background depth layering."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1a3704a7528ee768",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "4bc02e476595caa5",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 40,
        "dependency_reason": "순찰정 갑판 배경 및 분위기 연속성 참조",
        "_shot_index": 15,
        "visible_entities": [
          "L38"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 87,
            "shot_index": 15
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Directly behind 강민숙(홍은미) at shoulder height, hold her squared back across the central foreground as a human barrier, with 김지후(강수리영) visible beyond one shoulder in the stern area. The static medium frame lets 민숙's planted posture replace the preceding panic with a single immovable silhouette, while the threatening passage remains ahead and outside the frame.",
            "lighting_mood": "Natural daytime light is controlled into high contrast around 민숙's blocking silhouette and 수리영's fearful face.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "L38"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "patrol_boat_deck_daytime",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The setting is the exterior deck of a moving police patrol boat surrounded by the open sea. The space features metal guardrails along the edges and is consistently bathed in stark, natural daytime light.",
                "applies_to_shots": [
                  15,
                  19,
                  23
                ],
                "element_scope": "full",
                "source_facts": [
                  "경찰 순찰정 외부 및 갑판",
                  "순찰정 난간",
                  "레일 바",
                  "Natural daytime light",
                  "open sea"
                ],
                "visual_inferences": [
                  "The boat deck has a typical maritime utilitarian appearance with sturdy metal railings."
                ],
                "creative_decisions": [
                  "Natural daylight is used to create stark contrast against the subdued surrounding palette."
                ],
                "confidence": "high"
              },
              {
                "element_id": "kim_jihoo_tearful_face",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "The young woman's face is noticeably damp and continuously streaked with fresh tears. The visual moisture on her cheeks catches the daylight, emphasizing her ongoing crying state.",
                "applies_to_shots": [
                  15,
                  23
                ],
                "element_scope": "close",
                "source_facts": [
                  "울먹이는 김지후",
                  "절망적으로 오열하는 김지후",
                  "tearful face"
                ],
                "visual_inferences": [
                  "Continuous shedding of tears leaves visible wet streaks down her face and around her eyes."
                ],
                "creative_decisions": [
                  "High contrast lighting is specifically directed on her face to highlight the reflective wetness of her tears."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 40,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "5871cda8b345bdde"
      },
      {
        "scene_index": 87,
        "heading": "경찰 순찰정 - 계속",
        "beat_title": "함께 바다로 몸을 던지는 민숙과 산들",
        "representative_moment": "강민숙이 고산들을 꽉 끌어안은 채 순찰정 난간 너머로 함께 몸을 던져 허공에 떠 있는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "lateral waist-height broadside composition with stark natural daylight",
            "t2i_prompt": "Photorealistic cinematic still. A lateral waist-height broadside composition. An East Asian middle-aged woman in right profile, arms locked tightly around the torso of C08O11, gazing off-screen. C08O11 in a dark outfit, an East Asian middle-aged man, at three-quarter angle from the left, visibly wounded with a pained expression, his gaze off-screen. Both figures are caught fully airborne in mid-fall, lateral momentum carrying them outward, their torsos and arms centered in the frame with feet implied beyond the edges, fabric streaming opposite to their motion. [L38: A sturdy metal guardrail of the patrol boat deck spans the lower frame as a clear horizontal threshold, bathed in stark natural daytime light, with the open sea visible below.]",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "S89 action: 강민숙이 고산들을 부등켜 안고 바다로 몸을 날림",
              "shot description: 강민숙이 고산들을 끌어안은 채 순찰정 난간 너머로 허공에 떠 있는 순간",
              "DP framing: Track laterally at waist height in a broadside wide frame, both bodies caught fully airborne just beyond the barrier"
            ],
            "visual_inferences": [
              "fixed_element patrol_boat_deck_daytime: metal guardrails along the edges, stark natural daytime light",
              "motion freeze: mid-air suspension with clothes streaming opposite to the lateral outward motion"
            ],
            "creative_decisions": [
              "waist-height framing focuses on the torsos and locked arms, pushing the head and feet to the edges to comply with geometrical constraints",
              "guardrail placed in the lower frame to act as a clear horizontal threshold separating the deck from the sea",
              "stark natural daylight utilized to freeze the airborne action in sharp contrast"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a401903902099e55",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a4283f8d879c490e",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 23,
        "dependency_reason": "previous_shot_refs에 명시된 바와 같이, 동일한 순찰정 배경(선상, 난간, 오픈 바다) 및 낮 시간대의 자연광 분위기를 일관되게 유지하기 위함",
        "_shot_index": 19,
        "visible_entities": [
          "C08",
          "L38"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 87,
            "shot_index": 19
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track laterally at waist height in a broadside wide frame as 강민숙(홍은미), locked around 고산들, converts his charge into sideways momentum over the rail. Both bodies are caught fully airborne just beyond the barrier, with the rail forming a clear horizontal threshold beneath them and the sea visible below without anticipating the impact.",
            "lighting_mood": "Natural daylight freezes the airborne forms in stark contrast against the open sea while preserving the scene's restrained palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08",
              "L38"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "patrol_boat_deck_daytime",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The setting is the exterior deck of a moving police patrol boat surrounded by the open sea. The space features metal guardrails along the edges and is consistently bathed in stark, natural daytime light.",
                "applies_to_shots": [
                  15,
                  19,
                  23
                ],
                "element_scope": "full",
                "source_facts": [
                  "경찰 순찰정 외부 및 갑판",
                  "순찰정 난간",
                  "레일 바",
                  "Natural daytime light",
                  "open sea"
                ],
                "visual_inferences": [
                  "The boat deck has a typical maritime utilitarian appearance with sturdy metal railings."
                ],
                "creative_decisions": [
                  "Natural daylight is used to create stark contrast against the subdued surrounding palette."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 23,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "4dd11cad65fa85c2"
      },
      {
        "scene_index": 87,
        "heading": "89. 경찰 순찰정 - 계속",
        "beat_title": "절망적 오열과 제압",
        "representative_moment": "정인우에게 붙들린 채 멀어지는 바다를 바라보며 절망적으로 눈물을 흘리는 김지후의 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight close-up at eye level, severe intimate contrast lighting on the tearful face",
            "t2i_prompt": "Photorealistic cinematic still. At eye level in front of an Asian young woman, a tight close-up frames her tearful face at a three-quarter angle from the right, occupying most of the composition. She strains forward against a rear restraint, her noticeably damp cheeks continuously streaked with fresh tears, gazing into the distance at the off-screen sea. An Asian adult man remains partially visible behind her shoulder in an over-the-shoulder arrangement, looking down, his hands bracing and gripping her collar from behind with his restraining arm crossing the lower edge of the frame. Stark natural daytime light holds severe, intimate contrast on her wet face, while the surrounding color palette remains subdued. A short inner-facing section of a utilitarian metal guardrail sits directly behind their shoulders.",
            "outfit_assignments": [],
            "source_facts": [
              "절망적으로 오열하는 김지후",
              "인우가 가까스로 뒷덜미를 잡는다",
              "순찰정 난간",
              "Natural daytime light"
            ],
            "visual_inferences": [
              "The young woman's face is noticeably damp with continuous tear streaks",
              "The man restrains her from behind, pulling back on her collar to prevent her from jumping",
              "The metal guardrail serves as the immediate background edge in the tight framing"
            ],
            "creative_decisions": [
              "Tight close-up explicitly focused on the woman's face at a three-quarter angle to emphasize her profound grief while isolating her from the background",
              "Subdued surrounding palette contrasts sharply with the stark daylight catching the moisture on her cheeks"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "539e97387edeb80c",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "5b37c7c0ae03fb14",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 40,
        "dependency_reason": "이전 샷(씬 40)의 순찰정 갑판 배경 및 채광 연속성 유지 (단, 본 샷은 close framing 정책에 따라 배경 참조를 생략하고 프레임 엣지의 난간만 묘사함)",
        "_shot_index": 23,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 87,
            "shot_index": 23
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level in front of 김지후(강수리영), complete the dolly-in as a tight close-up angled three-quarters toward the off-screen sea, her tearful face occupying most of the frame without becoming straight-on. 정인우 remains partially visible behind one shoulder, his restraining arm crossing the lower edge while her body strains forward toward the receding foam beyond the camera.",
            "lighting_mood": "Natural daytime light is held in severe, intimate contrast on 수리영's tearful face, with the surrounding color kept subdued.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "patrol_boat_deck_daytime",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The setting is the exterior deck of a moving police patrol boat surrounded by the open sea. The space features metal guardrails along the edges and is consistently bathed in stark, natural daytime light.",
                "applies_to_shots": [
                  15,
                  19,
                  23
                ],
                "element_scope": "full",
                "source_facts": [
                  "경찰 순찰정 외부 및 갑판",
                  "순찰정 난간",
                  "레일 바",
                  "Natural daytime light",
                  "open sea"
                ],
                "visual_inferences": [
                  "The boat deck has a typical maritime utilitarian appearance with sturdy metal railings."
                ],
                "creative_decisions": [
                  "Natural daylight is used to create stark contrast against the subdued surrounding palette."
                ],
                "confidence": "high"
              },
              {
                "element_id": "kim_jihoo_tearful_face",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "The young woman's face is noticeably damp and continuously streaked with fresh tears. The visual moisture on her cheeks catches the daylight, emphasizing her ongoing crying state.",
                "applies_to_shots": [
                  15,
                  23
                ],
                "element_scope": "close",
                "source_facts": [
                  "울먹이는 김지후",
                  "절망적으로 오열하는 김지후",
                  "tearful face"
                ],
                "visual_inferences": [
                  "Continuous shedding of tears leaves visible wet streaks down her face and around her eyes."
                ],
                "creative_decisions": [
                  "High contrast lighting is specifically directed on her face to highlight the reflective wetness of her tears."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 40,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "137fdde44f35dbca"
      },
      {
        "scene_index": 88,
        "heading": "실외. 경찰 순찰정 - 잠시 후",
        "beat_title": "육지가 아닌 금월도 선착장",
        "representative_moment": "순찰정 선수 너머로 무녀복을 입은 영란과 산들, 마을 주민들이 일렬로 서서 다가오는 배를 무표정하게 응시하는 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level long-distance composition from the approaching boat, restrained natural lighting",
            "t2i_prompt": "Photorealistic cinematic still. Captured from a patrol boat's forward section at eye level. In the foreground, the boat's white bow occupies the lower edge, its forward-facing upper edge pointing toward the distance as a scale cue. Across the water, [L17: a concrete island dock] stretches horizontally, its boat-facing edge visible beyond the bow. Rooted at the center of the dock, a Korean elderly woman with white hair in a bright red shaman garment stands facing the camera, her eyes fixed on the camera. Beside her, C08O11 in dark casual clothes, a Korean middle-aged man, stands with his shoulders set, facing the camera with his gaze fixed on the camera. Flanking them, C23O25 in rustic workwear, a group of Korean villagers, are clustered in rigid ranks facing the camera, their eyes fixed on the camera, together forming an unnaturally fixed horizontal line. The distant island landmass rises beyond the dock in the background. Natural daytime illumination maintains a consistent, restrained contrast across the scene. The clear daylight provides even visibility over the ocean, the dock, and the boat without casting harsh or dramatic shadows, with the red shaman garment providing the sole pronounced color accent against the muted surroundings.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              },
              {
                "character_id": "C23",
                "outlook_id": "O25"
              }
            ],
            "source_facts": [
              "순찰정 선수 앞 저쪽으로 육지(금월도)와 뭍에 나와있는 사람들 모습",
              "붉은색 무녀복의 영란, 금월도 마을 사람들, 바다에 빠졌던 산들이 서 있음",
              "조타실 키를 잡은 창모가 배를 금월도 선착장 쪽으로 몰고 있음"
            ],
            "visual_inferences": [
              "fixed_element daytime_restrained_lighting: clear daylight provides even visibility over the ocean, the dock, and the boat",
              "The villagers stand in a rigid, unnatural horizontal line waiting for the boat's arrival"
            ],
            "creative_decisions": [
              "Placed the patrol boat's bow at the lower edge to create a foreground scale cue and emphasize the POV of the approaching vessel",
              "Used restrained daytime lighting to ground the unsettling sight of the motionless villagers in a stark, ordinary reality"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "34db7e4ec3864fce",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "209f1a15230cb06a",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "금월도 선착장 환경 및 배경 구조의 일관성 유지",
        "_shot_index": 3,
        "visible_entities": [
          "C08",
          "C23",
          "L17"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 88,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the patrol boat's forward section at eye level, hold a static long-distance wide composition past the bow toward the dock, where 강영란(흰 머리 여자), 고산들, and 금월도 마을 주민 form an unnaturally fixed horizontal line facing the vessel. The bow occupies only the lower edge as a scale cue, while 강영란's red shaman garment marks the central human anchor among the waiting figures.",
            "lighting_mood": "Natural daytime light holds the dock tableau in restrained contrast, with 강영란's red shaman garment providing the sole pronounced color accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08",
              "C23",
              "L17"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              },
              {
                "character_id": "C23",
                "outlook_id": "O25"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_restrained_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Natural daytime illumination maintains a consistent, restrained contrast across the scene. The clear daylight provides even visibility over the ocean, the dock, and the boat without casting harsh or dramatic shadows.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime light holds the dock tableau in restrained contrast (Shot 3)",
                  "Natural daytime illumination appropriate to the boat separates the wheelhouse threat axis with firm, restrained contrast (Shot 6)"
                ],
                "visual_inferences": [
                  "The overall weather and time of day remain stable and unchanged as the boat maneuvers around the island."
                ],
                "creative_decisions": [
                  "Keeping the contrast restrained and realistic to ground the sudden narrative shock in a stark, ordinary daylight atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 10,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "policy": "required"
              },
              {
                "kind": "character_outlook",
                "id": "C23O25",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "8aee04ef17f87f31"
      },
      {
        "scene_index": 88,
        "heading": "실외. 경찰 순찰정 - 잠시 후",
        "beat_title": "조타실을 장악하고 인우를 겨누는 창모",
        "representative_moment": "조타실 내부의 구창모가 총을 들어 갑판 밖에 있는 정인우를 향해 겨누고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Medium shot at shoulder height, pulling focus on the foreground aggressor with the background hostage in the opposing depth plane.",
            "t2i_prompt": "Photorealistic cinematic still. Positioned at shoulder height inside the L39 wheelhouse, torso and arms occupying the frame with lower legs implied beyond the bottom edge. C15O20 in a police uniform, a Korean man in his late 40s with a lean face, short black hair, and dark skin, stands in the foreground at three-quarter angle from the right, looking off-screen. He extends his arm, aiming a P05 handgun outward. Across the open doorway of the wheelhouse from each other, a Korean young man in a casual jacket stands on the exterior deck in the opposing background depth plane in left profile, frozen with shoulders tensed, looking down. The P05 barrel crosses the air between them, creating a sharp diagonal threat axis. The operating side of the steering wheel is visible nearby within the interior. Natural daytime illumination maintains a firm, restrained contrast without dramatic shadows, providing even visibility over the ocean outside.",
            "outfit_assignments": [
              {
                "character_id": "C15",
                "outlook_id": "O20"
              }
            ],
            "source_facts": [
              "S88 action: '창모가 총을 들어 인우를 겨눈다. 꼼짝할 수 없는 인우.'",
              "shot description: '조타실 안의 구창모가 총구를 밖의 정인우를 향해 정확히 겨누고 위협하는 찰나.'"
            ],
            "visual_inferences": [
              "fixed_element daytime_restrained_lighting: Natural daytime illumination maintains a consistent, restrained contrast.",
              "The open doorway serves as a shared spatial anchor dividing the foreground wheelhouse interior and the background deck.",
              "Unregistered character (정인우) is described using a common noun and demographic descriptor as required by the ID policy."
            ],
            "creative_decisions": [
              "Composing the shot at shoulder height to clearly capture the diagonal line of the extended gun arm stretching across the spatial gap between the two men.",
              "Keeping the lighting even and restrained to emphasize the cold, stark reality of the threat rather than using dramatic shadows."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "bee01d66b3599017",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "eed09b512af77826",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 88,
        "dependency_reason": "S88_Shot3의 분위기(atmosphere_reference)를 이어받아 맑은 대낮의 자연광과 절제된 대비를 유지",
        "_shot_index": 6,
        "visible_entities": [
          "C15",
          "L39",
          "P05"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 88,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Inside the wheelhouse at shoulder height, dolly in obliquely along 구창모's extended gun arm so his three-quarter figure occupies one side and 정인우 remains visible outside in the opposing depth plane. The barrel creates an unmistakable diagonal between them, while 정인우's arrested posture and partial profile make the threat legible without centering either man frontally.",
            "lighting_mood": "Natural daytime illumination appropriate to the boat separates the wheelhouse threat axis with firm, restrained contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C15",
              "L39",
              "P05"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C15",
                "outlook_id": "O20"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_restrained_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "Natural daytime illumination maintains a consistent, restrained contrast across the scene. The clear daylight provides even visibility over the ocean, the dock, and the boat without casting harsh or dramatic shadows.",
                "applies_to_shots": [
                  3,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime light holds the dock tableau in restrained contrast (Shot 3)",
                  "Natural daytime illumination appropriate to the boat separates the wheelhouse threat axis with firm, restrained contrast (Shot 6)"
                ],
                "visual_inferences": [
                  "The overall weather and time of day remain stable and unchanged as the boat maneuvers around the island."
                ],
                "creative_decisions": [
                  "Keeping the contrast restrained and realistic to ground the sudden narrative shock in a stark, ordinary daylight atmosphere."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 88,
                "shot_index": 3,
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C15O20",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "53b38e63958fde11"
      },
      {
        "scene_index": 89,
        "heading": "실외. 금월도 갯바위 - 계속",
        "beat_title": "만족스러운 미소로 순찰정을 반기는 영란",
        "representative_moment": "다가오는 순찰정을 바라보며 만족스러운 미소를 띠고 있는 강영란의 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close frontal three-quarter view with natural ambient exterior light and restrained contrast",
            "t2i_prompt": "Photorealistic cinematic still. An elderly Asian woman with white hair in a red shaman dress, at three-quarter angle from the left, occupies most of the frame. Positioned slightly off-center at eye level, she keeps her chin still with a satisfied smile resting on her face, her unwavering gaze fixed off-screen. Natural ambient exterior light with restrained contrast evenly shapes her expression. [: A narrow trace of out-of-focus dark rocky shore] forms the immediate background edge behind her.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: Kang Young-ran (white-haired woman) smiling with satisfaction, looking at the approaching patrol boat off-screen",
              "scene text: 다가오는 순찰정을 보며 만족스런 미소의 영란"
            ],
            "visual_inferences": [
              "Kang Young-ran assigned a red shaman dress based on scene summary",
              "Demographic descriptor mapped to an elderly Asian woman",
              "Background restricted to a narrow out-of-focus edge due to close framing skip policy"
            ],
            "creative_decisions": [
              "Face positioned slightly off-center to emphasize the off-screen object of her attention",
              "Restrained contrast applied to the lighting to ensure the satisfied smile is fully readable without harsh shadows"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "aft deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boarding gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boat hull",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "foredeck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passageway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "patrol boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "safety rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "water",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "0a2b8321b4b39c29",
              "owned_hash": "a719c13f467aa5bf",
              "camera_direction_hash": "9129eb7aafb2c2ba",
              "owned_usage_hash": "4da784a46b6cf86c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 63,
        "dependency_reason": "금월도 갯바위 배경 공간 요소 연속성",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 89,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level, hold a close frontal three-quarter view just beyond 강영란(흰 머리 여자)'s eyeline, keeping her face slightly off-center while the direction of the unseen patrol boat remains beyond the lens. The camera stays static as her held smile and unwavering off-screen gaze occupy most of the frame, with only a narrow trace of the rocky shore behind her.",
            "lighting_mood": "Natural ambient exterior light is shaped with restrained contrast, keeping the satisfied smile readable without specifying an unestablished source or color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L38B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 63,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "519e0527dd8e932a"
      },
      {
        "scene_index": 90,
        "heading": "실내. 반월 식당 - 해질녘",
        "beat_title": "텅 빈 식당의 적막한 노을",
        "representative_moment": "붉은 노을빛이 스며드는 텅 빈 식당 홀과 주방 입구의 적막한 전경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide eye-level view, low-key reddish sunset lighting",
            "t2i_prompt": "Photorealistic cinematic still. Wide view from eye level near the entrance, capturing the entirely empty restaurant interior. The central dining hall area remains still and unoccupied, with scattered empty tables and chairs casting subtle long shadows across the floor. In the background, the open door to the side room and the approach to the kitchen are clearly visible, devoid of any figures. Soft reddish sunset light filters through the window, illuminating the quiet space with a warm, low-key contrast.",
            "outfit_assignments": [],
            "source_facts": [
              "S90 action: '텅빈 식당에 붉으스름한 노을빛이 은은하게 스며든다.'",
              "shot description: 붉으스름한 노을빛이 스며드는 텅 빈 반월 식당 내부의 적막한 전경."
            ],
            "visual_inferences": [
              "fixed_element restaurant_interior_sunset: Empty tables and chairs are scattered in the hall.",
              "The approaches to the kitchen and room are visible in the background."
            ],
            "creative_decisions": [
              "Wide eye-level framing to emphasize the emptiness of the central floor area and the absence of characters.",
              "Low-key reddish lighting to create a nostalgic, isolating mood consistent with the DP's staging instructions."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boarding gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "open door to the side room"
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passageway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "safety rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "filters through the window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f84df313e82936b7",
              "owned_hash": "517866c8cfefbea5",
              "camera_direction_hash": "bf0a280003f4791b",
              "owned_usage_hash": "1c2bce3859da08cc",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "open door to the side room",
                  "reason": "The prompt refers to the open door as a background spatial anchor that is clearly visible, with no instruction to redraw or modify its structure, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "filters through the window",
                  "reason": "The prompt references the window solely as a physical anchor through which sunset light filters, without instructing any modification or creation of a new window.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 63,
        "dependency_reason": "previous_shot_refs indicates exact_background continuity with Scene 63 Shot 2 to maintain the same room structure.",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 90,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From eye level near the restaurant entrance, begin a measured dolly into a wide view that holds the empty hall together with the visible approaches to the kitchen and room. Keep the central floor area open and unoccupied, allowing the reddish sunset illumination to become the sole visual movement within the still interior.",
            "lighting_mood": "Soft reddish sunset light enters the empty restaurant, held in low-key contrast against the quiet interior.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L38B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench",
              "boarding gate",
              "deck",
              "door",
              "mast",
              "navigation unit",
              "passageway",
              "safety rail",
              "wheelhouse",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_interior_sunset",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The empty interior of the restaurant is illuminated by soft, reddish sunset light filtering in. The dining hall area remains still and unoccupied, with a low-key contrast that highlights the quiet atmosphere.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "텅빈 식당에 붉으스름한 노을빛이 은은하게 스며든다.",
                  "Soft reddish sunset light enters the empty restaurant, held in low-key contrast against the quiet interior."
                ],
                "visual_inferences": [
                  "Empty tables and chairs are scattered in the hall, casting subtle shadows in the reddish light.",
                  "The approaches to the kitchen and room are visible in the background."
                ],
                "creative_decisions": [
                  "Using the reddish sunset as the primary light source to create a nostalgic and slightly isolating mood.",
                  "Maintaining the central floor area distinctly empty to emphasize the stillness of the space."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 63,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L38B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "edcedf3cd56764fe"
      },
      {
        "scene_index": 90,
        "heading": "실내. 반월 식당 - 해질녘",
        "beat_title": "빈 식당에서 엄마를 찾는 수리영",
        "representative_moment": "아무도 없는 식당 홀 한가운데 멈춰 서서 소리가 나는 곳을 찾는 C01의 전신 샷.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide framing, low-key contrast with reddish sunset lighting",
            "t2i_prompt": "Photorealistic cinematic still. Eye-level wide framing from across the hall capturing the full body of the subject. C01O01 in a casual outfit, a Korean woman in her early 20s with long black straight hair and a pale oval face, stands at three-quarter angle from the right near the center. Her feet are halted mid-search on the floor, her eyes gazing off-screen with a puzzled expression. The empty interior of the restaurant is illuminated by soft, reddish sunset light filtering in through the window. The dining hall area remains still and unoccupied, with a low-key contrast that highlights the quiet atmosphere. The approach to the kitchen is visible behind her to one side, while the door to the room balances the rear composition on the opposite side, leaving open negative space around the isolated figure.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "텅빈 식당에 붉으스름한 노을빛이 은은하게 스며든다.",
              "수리영이 엄마를 찾는다. 홀을 둘러봐도 민숙 모습은 보이지 않는다."
            ],
            "visual_inferences": [
              "fixed_element environment_state: The empty interior of the restaurant is illuminated by soft, reddish sunset light filtering in.",
              "C01's feet halted mid-search, three-quarter right angle, gazing off-screen.",
              "Empty negative space emphasizes the isolation and absence of other characters."
            ],
            "creative_decisions": [
              "Eye-level wide framing to naturally include the full body of the character without conflicting with camera height constraints.",
              "Soft reddish low-key lighting to enhance the nostalgic and isolating mood of the scene.",
              "Anchoring background elements (kitchen approach and door) to balance the composition while keeping the center empty."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "boarding gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "the door to the room balances the rear composition"
              },
              {
                "owned_token": "mast",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation unit",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passageway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "safety rail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wheelhouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "anchor",
                "source_phrase": "filtering in through the window"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "bd44e535a08b79d0",
              "owned_hash": "517866c8cfefbea5",
              "camera_direction_hash": "5f73c8c59665496c",
              "owned_usage_hash": "553a0219f30f65b9",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "the door to the room balances the rear composition",
                  "reason": "The door is mentioned purely as a spatial anchor to balance the composition, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "window",
                  "violating_phrase": "filtering in through the window",
                  "reason": "The window is referenced only to describe light filtering through it, serving as an environmental anchor without redraw instructions.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 63,
        "dependency_reason": "exact_background (same room/environment styling for the restaurant interior)",
        "_shot_index": 4,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 90,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At waist height across the hall, finish the dolly-out at a full-body distance and then lock the frame, placing 김지후(강수리영) near the center with empty space surrounding her. Her halted search is held without further camera movement, while the kitchen and room approaches remain separated behind her as evidence that both have yielded nothing.",
            "lighting_mood": "Reddish sunset light remains soft across the empty hall, with restrained contrast isolating 김지후(강수리영) in the surrounding stillness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L38B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bench",
              "boarding gate",
              "deck",
              "door",
              "mast",
              "navigation unit",
              "passageway",
              "safety rail",
              "wheelhouse",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_interior_sunset",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The empty interior of the restaurant is illuminated by soft, reddish sunset light filtering in. The dining hall area remains still and unoccupied, with a low-key contrast that highlights the quiet atmosphere.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "텅빈 식당에 붉으스름한 노을빛이 은은하게 스며든다.",
                  "Soft reddish sunset light enters the empty restaurant, held in low-key contrast against the quiet interior."
                ],
                "visual_inferences": [
                  "Empty tables and chairs are scattered in the hall, casting subtle shadows in the reddish light.",
                  "The approaches to the kitchen and room are visible in the background."
                ],
                "creative_decisions": [
                  "Using the reddish sunset as the primary light source to create a nostalgic and slightly isolating mood.",
                  "Maintaining the central floor area distinctly empty to emphasize the stillness of the space."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 63,
                "shot_index": 14,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L38B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "9be37a54c6fd7cab"
      },
      {
        "scene_index": 91,
        "heading": "실외. 식당 뒤뜰 - 해질녘",
        "beat_title": "허공에 울리는 자장가와 빈 마당",
        "representative_moment": "수리영이 붉은 노을이 지는 텅 빈 뒤뜰에서 고개를 반쯤 돌린 채 불안한 눈빛으로 허공을 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height observer perspective, restrained high-contrast sunset lighting, negative space framing",
            "t2i_prompt": "Photorealistic cinematic still. From a chest-height observer perspective, a young Korean woman occupies the right side of the frame, her torso and head visible against the fading daylight. She stands at a three-quarter angle from the left, her weight shifting during a cautious scan. Her head is half-turned, eyes fixed off-screen toward the left, leaving an expansive, empty negative space of the deserted restaurant backyard in the direction of her gaze. Restrained natural ambient sunset light casts high-contrast shadows around her anxious eyes. The outdoor dirt ground and quiet surroundings stretch out behind her, entirely devoid of any other figures.",
            "outfit_assignments": [],
            "source_facts": [
              "S91 action: 수리영은 계속 주변을 돌아보며 민숙을 찾는다. 어딘가에서 다정한 자장가 소리는 계속 되지만, 모습은 보이지 않는다.",
              "shot description: 식당 뒤뜰에 서서 고개를 옆으로 반쯤 돌린 채 불안한 눈빛으로 주변을 응시하는 모습"
            ],
            "visual_inferences": [
              "Sunset lighting implies fading natural light and deep shadows",
              "The absence of her mother translates to empty negative space in the frame"
            ],
            "creative_decisions": [
              "Positioning the character on the right to create significant negative space on the left, aligning with her off-screen gaze to build suspense and emphasize the emptiness",
              "Focusing high-contrast light specifically around the eyes to highlight her anxiety without revealing the whole environment clearly"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "75a20ae8fa61f0e6",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "30f8b336a59a9e10",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 91,
            "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 chest height at a three-quarter frontal angle, observe 김지후(강수리영) at medium distance as her weight shifts during a cautious scan of the backyard. Hold her in one side of the frame and preserve open space in the direction of her half-turned head, preparing the straight push-in that follows the same gaze axis.",
            "lighting_mood": "Natural ambient light appropriate to sunset is kept restrained and high-contrast around her anxious eyes.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "198ece3ac1a5c6b2"
      },
      {
        "scene_index": 92,
        "heading": "실외. 반월 식당 앞 - 해질녘",
        "beat_title": "강민숙의 쓸쓸한 뒷모습 발견",
        "representative_moment": "A Korean middle-aged woman sits alone at the end of the stone dock at sunset, her back to the camera, looking out at the sea.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide framing, low seated-axis height, natural sunset light",
            "t2i_prompt": "Photorealistic cinematic still. A Korean middle-aged woman, with her back to the camera, is seated at the end of the stone dock in the middle-center midground, gazing into the distance at the sea beyond the dock in the upper-center background. The low, seated-axis camera anchors her clearly defined back and seated body in the lower middle of the wide frame. The rough stone surface of the dock leads past her toward the water. Natural sunset light outlines her back with a warm rim light, separating her silhouette gently from the dimming sea without revealing any facial features. The unmoving posture and the wide, empty space around her emphasize a sense of quiet isolation.",
            "outfit_assignments": [],
            "source_facts": [
              "scene text: '선착장 돌바닥에 앉아 바다를 보는 민숙의 뒷모습이다.'",
              "shot description: 강민숙 seated on the stone dock looking at the sea, back to camera",
              "camera_direction: Centered behind the figure at low seated-axis height, wide frame"
            ],
            "visual_inferences": [
              "exact_background ref usage dictates keeping the exterior environment consistent with the previous scene",
              "sunset lighting creates a glowing edge around her silhouette to preserve depth without showing the face"
            ],
            "creative_decisions": [
              "use of a wide, low-angle composition to make the stone path a leading line toward the ocean, enhancing the feeling of solitude"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "buoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "restaurant",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "signboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "9d27c7a51358eab4",
              "owned_hash": "a3eaa48604f8b3a9",
              "camera_direction_hash": "12b9277e501c133c",
              "owned_usage_hash": "120033990be4e57c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "pier",
                  "violating_phrase": "seated at the end of the stone dock",
                  "reason": "The prompt uses the 'stone dock' (equivalent to the owned 'pier') purely as a spatial anchor for the woman's position without demanding any redrawing, which contradicts the producer's absent declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 85,
        "dependency_reason": "exact_background ref_usage from previous shot to maintain consistency of the pier/exterior location",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 92,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Centered behind 강민숙(홍은미) at the supplied low seated-axis height, continue the dolly-in until her clearly defined back and seated body anchor the lower middle of a wide frame. The stone dock leads past her toward the sea, while her unmoving orientation keeps her face completely withheld.",
            "lighting_mood": "Natural sunset light outlines the seated back and separates it gently from the sea without revealing her face.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "end of the stone dock",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "sea beyond the dock",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L18B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "awning",
              "bollard",
              "buoy",
              "door",
              "fishing boat",
              "pier",
              "railing",
              "restaurant",
              "rope",
              "signboard",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 85,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L18B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "ce2f698db1b76afc"
      },
      {
        "scene_index": 93,
        "heading": "95. 실외. 선착장 - 해질녘",
        "beat_title": "섬뜩한 미소로 고개를 돌리는 영란",
        "representative_moment": "어깨 너머로 고개를 돌려 수리영을 향해 섬뜩한 미소를 짓는 흰 머리의 강영란.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium over-the-shoulder framing at seated head height, ominous high-contrast sunset lighting",
            "t2i_prompt": "Photorealistic cinematic still. An elderly Asian woman with white hair sits with her back to the camera on a stone pier, captured in a medium over-the-shoulder composition at seated head height. Her upper back and near shoulder anchor the lower foreground. Her head is turned sharply backward over her shoulder, positioning her eerily smiling face in the upper third of the frame. She gazes past the lens toward an off-screen figure, while whatever she holds remains completely hidden below the bottom frame edge. The outdoor scene is bathed in a muted golden sunset light from behind, throwing her facial features into stark, high-contrast relief. The distant sea surface sparkles with a warm yet ominous golden reflection behind her.",
            "outfit_assignments": [],
            "source_facts": [
              "강영란(흰 머리 여자)'s face appears in an over-the-shoulder turn, keeping the near shoulder large",
              "Sunset light and the sea's muted golden reflection hold the smile in ominous, high-contrast relief.",
              "gaze=looks_at_character (past the lens toward the off-screen protagonist)",
              "concealed burden remains hidden below the frame edge"
            ],
            "visual_inferences": [
              "fixed_element young_ran_seated_shoulder: back or shoulder oriented toward the camera, serving as a foreground anchor point",
              "fixed_element pier_sunset_environment: stark, high-contrast sunset atmosphere on the pier"
            ],
            "creative_decisions": [
              "Omitted the C## ID and L23 label completely as per constraints and modification requests, using generic demographics (elderly Asian woman) and plain nouns (pier).",
              "Locked the framing at seated head height, placing the torso in the lower foreground and the turned face in the upper third to emphasize the unsettling reveal without showing the corpse."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ladder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "on a stone pier"
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c1df74c5da982738",
              "owned_hash": "22c0c060c8cd44d5",
              "camera_direction_hash": "f59092039a70e154",
              "owned_usage_hash": "d3909bb293da04da",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "pier",
                  "violating_phrase": "on a stone pier",
                  "reason": "The prompt mentions the pier only as a spatial anchor for the woman to sit on, which is consistent with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 27,
        "dependency_reason": "exact_background (이전 씬의 선착장 공간과 석양 조명 연속성 유지)",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 93,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At seated head height and medium-close distance, track around the seated shoulder until 강영란(흰 머리 여자)'s face appears in an over-the-shoulder turn, keeping the near shoulder large but below the object-occupancy limit. Hold briefly with her smile near one upper third and her gaze traveling past the lens toward 김지후(강수리영), while the concealed burden remains hidden below the frame edge.",
            "lighting_mood": "Sunset light and the sea's muted golden reflection hold the smile in ominous, high-contrast relief.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "fishing boat",
              "ladder",
              "lamp",
              "pier",
              "railing",
              "rope"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_sunset_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor pier environment is bathed in a muted golden sunset light. The lighting creates a stark, high-contrast atmosphere, with the sea surface reflecting the warm yet ominous golden hour illumination.",
                "applies_to_shots": [
                  5,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Sunset light and the sea's muted golden reflection hold the smile in ominous, high-contrast relief.",
                  "Sunset illumination is held in stark contrast... with restrained muted gold remaining in the surrounding scene.",
                  "Muted golden sunset light is restrained by high contrast..."
                ],
                "visual_inferences": [
                  "The sun is very low on the horizon, casting harsh, dramatic shadows and highlighting the subjects against the darkening environment."
                ],
                "creative_decisions": [
                  "Using the high-contrast sunset to starkly isolate the terrifying elements (the eerie smile, the pale corpse, the paralyzed protagonist) against a beautiful but indifferent background."
                ],
                "confidence": "high"
              },
              {
                "element_id": "young_ran_seated_shoulder",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "The white-haired woman remains in a seated posture with her back or shoulder oriented toward the camera. Her upper back and shoulder serve as an anchor point, illuminated by the sunset from behind.",
                "applies_to_shots": [
                  5,
                  8
                ],
                "element_scope": "close",
                "source_facts": [
                  "track around the seated shoulder until 강영란(흰 머리 여자)'s face appears in an over-the-shoulder turn, keeping the near shoulder large",
                  "seated, arms partly lowered",
                  "강영란(흰 머리 여자)'s supporting shoulder and lowered arms retained at the upper edge"
                ],
                "visual_inferences": [
                  "Her body is positioned facing the sea, and she is interacting with the space mostly through turning her head or dropping her arms, keeping her main torso stationary."
                ],
                "creative_decisions": [
                  "Keeping the woman's shoulder prominent in the frame to maintain a physical connection between her eerie reaction in the first shot and the dropped corpse in the next."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 27,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L23B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "741b5444de731582"
      },
      {
        "scene_index": 93,
        "heading": "실외. 선착장 - 해질녘",
        "beat_title": "강영란의 어깨에서 떨어져 내리는 강민숙의 창백한 시신",
        "representative_moment": "The pale, wet corpse of a middle-aged woman slips from the shoulder of a seated elderly woman against a stark sunset.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium over-the-shoulder framing, tilt downward, high-contrast sunset lighting",
            "t2i_prompt": "Photorealistic cinematic still. An elderly Korean woman with white hair sits facing away from the camera, her supporting shoulder and partly lowered arms anchored in the upper frame, with the dock floor below the falling body visible in the lower-center background. Suspended diagonally across the middle and lower frame, the wet, lifeless body of a pale middle-aged Korean woman hangs loose at a three-quarter angle from the right, her face aimed downward with eyes closed. Muted golden sunset light strikes from behind, tracing a stark rim light on the seated elderly woman's shoulder and throwing the corpse's pale skin into high contrast against the restrained, dark gold shadows of the surrounding pier.",
            "outfit_assignments": [],
            "source_facts": [
              "강영란(흰 머리 여자)'s supporting shoulder and lowered arms retained at the upper edge",
              "강민숙(홍은미)'s explicitly pale face and wet body",
              "corpse slipping diagonally through the middle and lower frame, limbs hanging loose",
              "Sunset illumination is held in stark contrast... with restrained muted gold remaining"
            ],
            "visual_inferences": [
              "fixed_element pier_sunset_environment: The outdoor pier environment is bathed in a muted golden sunset light, creating a stark, high-contrast atmosphere",
              "fixed_element young_ran_seated_shoulder: The white-haired woman remains in a seated posture with her back or shoulder oriented toward the camera, illuminated by the sunset from behind"
            ],
            "creative_decisions": [
              "Positioned the older woman's shoulder at the upper edge to provide a visual and narrative anchor for the falling body in the medium frame",
              "Used a freeze-frame 'suspended' pose for the corpse to emphasize the lifeless weight dropping toward the dock floor"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ladder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "surrounding pier"
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "316c587bac618abc",
              "owned_hash": "22c0c060c8cd44d5",
              "camera_direction_hash": "0f5c642b21f30498",
              "owned_usage_hash": "5f5b17aa91d1a186",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "pier",
                  "violating_phrase": "surrounding pier",
                  "reason": "The prompt mentions the 'surrounding pier' solely as a shadow and spatial anchor to contrast the lighting, which aligns with the producer's anchor declaration and does not request a redraw.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 93,
        "dependency_reason": "exact_background matching the pier environment established in scene 93, shot 5",
        "_shot_index": 8,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 93,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Close beside 강영란(흰 머리 여자) at shoulder height, tilt downward into a slightly wider frame beneath her shoulder so 강민숙(홍은미)'s pale face and half-fallen body remain visible together. Place the slipping corpse diagonally through the middle and lower frame, with 강영란(흰 머리 여자)'s supporting shoulder and lowered arms retained at the upper edge as scale and causal context.",
            "lighting_mood": "Sunset illumination is held in stark contrast against 강민숙(홍은미)'s explicitly pale face and wet body, with restrained muted gold remaining in the surrounding scene.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "dock floor below the falling body",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "fishing boat",
              "ladder",
              "lamp",
              "pier",
              "railing",
              "rope"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_sunset_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor pier environment is bathed in a muted golden sunset light. The lighting creates a stark, high-contrast atmosphere, with the sea surface reflecting the warm yet ominous golden hour illumination.",
                "applies_to_shots": [
                  5,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Sunset light and the sea's muted golden reflection hold the smile in ominous, high-contrast relief.",
                  "Sunset illumination is held in stark contrast... with restrained muted gold remaining in the surrounding scene.",
                  "Muted golden sunset light is restrained by high contrast..."
                ],
                "visual_inferences": [
                  "The sun is very low on the horizon, casting harsh, dramatic shadows and highlighting the subjects against the darkening environment."
                ],
                "creative_decisions": [
                  "Using the high-contrast sunset to starkly isolate the terrifying elements (the eerie smile, the pale corpse, the paralyzed protagonist) against a beautiful but indifferent background."
                ],
                "confidence": "high"
              },
              {
                "element_id": "young_ran_seated_shoulder",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "The white-haired woman remains in a seated posture with her back or shoulder oriented toward the camera. Her upper back and shoulder serve as an anchor point, illuminated by the sunset from behind.",
                "applies_to_shots": [
                  5,
                  8
                ],
                "element_scope": "close",
                "source_facts": [
                  "track around the seated shoulder until 강영란(흰 머리 여자)'s face appears in an over-the-shoulder turn, keeping the near shoulder large",
                  "seated, arms partly lowered",
                  "강영란(흰 머리 여자)'s supporting shoulder and lowered arms retained at the upper edge"
                ],
                "visual_inferences": [
                  "Her body is positioned facing the sea, and she is interacting with the space mostly through turning her head or dropping her arms, keeping her main torso stationary."
                ],
                "creative_decisions": [
                  "Keeping the woman's shoulder prominent in the frame to maintain a physical connection between her eerie reaction in the first shot and the dropped corpse in the next."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 93,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L23B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "a8a70e628ec1bc86"
      },
      {
        "scene_index": 93,
        "heading": "실외. 선착장 - 해질녘",
        "beat_title": "마주한 끔찍한 환각과 굳어버린 몸",
        "representative_moment": "C01 stands entirely paralyzed with terror in the center of the pier, tears welling in her eyes.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level wide frame, high-contrast muted golden sunset lighting",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual jacket, a young Korean woman, standing completely isolated in the center of the stone pier, facing the camera with her full body visible from head to toe. Her knees are locked tight and her rigid shoulders convey sheer paralysis. Her tear-filled eyes are fixed forward on an unseen figure. Captured from an observer's standing eye level directly before her, the wide framing emphasizes the empty open space around her frozen figure. The outdoor pier environment is bathed in a stark, high-contrast muted golden sunset light. The harsh illumination clearly picks out the tears on her face against the deep shadows, while in the background, the sea surface reflects the warm, ominous golden hour light behind the distant breakwater.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "S93 action: '소스라치게 놀라는 수리영. 부들부들 떨리는 몸, 어느새 눈물이 고인 눈...'",
              "shot description: full-body view, standing rigid at the center of the dock",
              "C01: facing_camera, knees locked, shoulders trembling, gaze=looks_at_character"
            ],
            "visual_inferences": [
              "fixed_element pier_sunset_environment: stark, high-contrast atmosphere, muted golden sunset light",
              "off-screen gaze directed forward toward the hallucination"
            ],
            "creative_decisions": [
              "Wide framing isolates C01 in the center to emphasize her physical paralysis and vulnerability",
              "High contrast lighting sharply highlights her tear-filled face while keeping the surrounding environment indifferent and vast"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "anchor",
                "source_phrase": "behind the distant breakwater"
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ladder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "in the center of the stone pier"
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a1765e5119279c65",
              "owned_hash": "22c0c060c8cd44d5",
              "camera_direction_hash": "0d6428e970fdd6cc",
              "owned_usage_hash": "5a5dd59a8a9bc93b",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "breakwater",
                  "violating_phrase": "behind the distant breakwater",
                  "reason": "The prompt uses the breakwater as a distant background spatial anchor to position the reflection of light, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pier",
                  "violating_phrase": "in the center of the stone pier",
                  "reason": "The prompt mentions the pier purely as a spatial anchor to position the character, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 67,
        "dependency_reason": "S67_Shot8 exact_background for the pier sunset environment",
        "_shot_index": 10,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 93,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At standing eye level directly before 김지후(강수리영), complete the dolly-out from her face to a full-body view and hold her near the center of the dock. Her rigid body occupies a narrow central column while open space around her makes the trembling shoulders, locked knees, and tear-filled stare read as paralysis rather than a posed portrait.",
            "lighting_mood": "Muted golden sunset light is restrained by high contrast, leaving the tear-filled face legible while the full body feels exposed.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L23B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "fishing boat",
              "ladder",
              "lamp",
              "pier",
              "railing",
              "rope"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_sunset_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor pier environment is bathed in a muted golden sunset light. The lighting creates a stark, high-contrast atmosphere, with the sea surface reflecting the warm yet ominous golden hour illumination.",
                "applies_to_shots": [
                  5,
                  8,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "Sunset light and the sea's muted golden reflection hold the smile in ominous, high-contrast relief.",
                  "Sunset illumination is held in stark contrast... with restrained muted gold remaining in the surrounding scene.",
                  "Muted golden sunset light is restrained by high contrast..."
                ],
                "visual_inferences": [
                  "The sun is very low on the horizon, casting harsh, dramatic shadows and highlighting the subjects against the darkening environment."
                ],
                "creative_decisions": [
                  "Using the high-contrast sunset to starkly isolate the terrifying elements (the eerie smile, the pale corpse, the paralyzed protagonist) against a beautiful but indifferent background."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 67,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L23B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "7c4f0e2b8287df63"
      },
      {
        "scene_index": 94,
        "heading": "96. 실내. 숲 속 동굴 - 낮",
        "beat_title": "동굴 벽에 묶인 인우의 처참한 모습",
        "representative_moment": "정인우가 상처투성이 얼굴로 반대편 벽에 쇠사슬로 묶인 채 수리영이 있는 방향을 바라보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide full-body view, mid-height observer angle, low-key high-contrast natural lighting",
            "t2i_prompt": "Photorealistic cinematic still. From a mid-height observer position, a wide full-body view of an Asian man in rugged clothes positioned slightly off-center against the opposite rough stone wall. He is at a three-quarter angle from the right, severely injured with visible facial wounds, his knees bent and wrists secured by a thick chain to the restraint anchor on the wall. His eyes are fixed across the open spatial interval of the dirt floor. Subdued natural ambient daylight creates a high-contrast, low-key lighting environment with deep, heavy shadows across the rocky surfaces, exposing the man's damaged face.",
            "outfit_assignments": [],
            "source_facts": [
              "실내. 숲 속 동굴 - 낮",
              "반대쪽 벽에 인우 역시 묶인 상태. 얼굴 여기저기가 긁히고, 터지고… 형편이 없다.",
              "인우(O.S.) 정신 좀 차려봐! 지후야!!"
            ],
            "visual_inferences": [
              "The cave has uneven, rugged rock walls and a natural dirt floor.",
              "The daylight is very limited, resulting in deep shadows that obscure parts of the cave.",
              "The character is restrained using heavy chains anchored to the wall.",
              "The wide shot establishes the spatial distance between the two captives."
            ],
            "creative_decisions": [
              "Positioned the subject slightly off-center in a wide full-body view to emphasize the empty space separating him from the observer.",
              "Used high-contrast, low-key lighting to highlight the brutal facial injuries and the gritty texture of the stone wall and chain."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "chain",
                "usage_kind": "anchor",
                "source_phrase": "secured by a thick chain"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "doorway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "anchor",
                "source_phrase": "of the dirt floor"
              },
              {
                "owned_token": "restraint anchor",
                "usage_kind": "anchor",
                "source_phrase": "to the restraint anchor on the wall"
              },
              {
                "owned_token": "wall",
                "usage_kind": "anchor",
                "source_phrase": "against the opposite rough stone wall"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "4e2999b6084f628d",
              "owned_hash": "826a8173f1c7ed48",
              "camera_direction_hash": "bc4e0a140060037b",
              "owned_usage_hash": "8efc9c2f3dd569a3",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "chain",
                  "violating_phrase": "wrists secured by a thick chain",
                  "reason": "The chain is referenced to specify the physical restraint of the character, serving as a spatial anchor rather than a new element to be drawn.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "floor",
                  "violating_phrase": "open spatial interval of the dirt floor",
                  "reason": "The floor is used as a spatial reference for the direction of the character's gaze, which matches the anchor usage.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "restraint anchor",
                  "violating_phrase": "to the restraint anchor on the wall",
                  "reason": "The restraint anchor is mentioned solely as a point of attachment to anchor the character's pose to the background.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "wall",
                  "violating_phrase": "against the opposite rough stone wall",
                  "reason": "The wall is referenced as a spatial backdrop to position the character, aligning with the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 66,
        "dependency_reason": "이전 샷(Scene 66, Shot 1)에서 설정된 동굴의 공간적 연속성과 배경 요소(exact_background)를 동일하게 유지하기 위함",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 94,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From mid-height near 김지후(강수리영)'s side of the cave, finish the pan on a wide full-body view of 정인우 against the opposite wall. Hold him slightly off-center with his chained limbs and damaged face visible in one continuous silhouette, preserving the empty distance across the cave as the axis back toward 김지후(강수리영).",
            "lighting_mood": "Natural ambient daylight appropriate to the cave setting is shaped in low-key contrast, exposing the facial injuries without adding an unestablished light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L53B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "chain",
              "door",
              "doorway",
              "floor",
              "restraint anchor",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cave_environment_and_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a natural forest cave features rough, uneven stone walls and a dirt floor. The space is dimly illuminated by subdued natural ambient daylight filtering in, creating a high-contrast, low-key lighting environment with deep, heavy shadows across the rocky surfaces.",
                "applies_to_shots": [
                  2,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실내. 숲 속 동굴 - 낮",
                  "Natural ambient daylight appropriate to the cave setting is shaped in low-key contrast (Shot 2)",
                  "Natural ambient daylight appropriate to the cave is kept subdued and high-contrast (Shot 7)"
                ],
                "visual_inferences": [
                  "The cave has uneven, rugged rock walls and a natural dirt floor.",
                  "The daylight is very limited, resulting in deep shadows that obscure parts of the cave."
                ],
                "creative_decisions": [
                  "Using a very subdued, high-contrast lighting setup to visually reflect the grim captivity and despair of the characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 66,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L53B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "942b8753255616b2"
      },
      {
        "scene_index": 94,
        "heading": "실내. 숲 속 동굴 - 낮",
        "beat_title": "망연자실한 수리영",
        "representative_moment": "쇠사슬에 묶인 C01이 삶의 의지를 잃은 채 텅 빈 눈으로 동굴 바닥을 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Close framing from slightly above the lowered eye line, off-center placement, high-contrast natural lighting",
            "t2i_prompt": "Photorealistic cinematic still. Close framing from slightly above her lowered eye line, tightened off-center around the face of C01O01 in a dark casual top, a young East Asian woman with a pale oval face and long straight black hair. She is seen at a three-quarter angle from the left, her posture slumped with chin heavily lowered. Her eyes are entirely vacant, gazing downward off-screen. Subdued, high-contrast natural ambient daylight wraps her pale face in deep, heavy shadows, leaving the empty eyes softly lit without introducing unestablished colors. A section of thick metal chain is partially visible near the frame edge securing her shoulder. [: A narrow strip of rough dirt cave floor is visible at the lower frame edge beneath the direction of her downward gaze.]",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영이 희미하게 눈을 뜬다. 민숙이 그랬던 것처럼 쇠사슬에 단단히 묶인 상태.",
              "대답을 않는 수리영. 모든 것을 포기해버린 듯 망연자실한 모습이다.",
              "Shot 7: 삶의 의지를 모두 잃은 듯 텅 빈 눈동자로 바닥을 멍하니 응시하는 김지후(강수리영)의 모습.",
              "Natural ambient daylight appropriate to the cave is kept subdued and high-contrast around the vacant eyes"
            ],
            "visual_inferences": [
              "The heavy shadows on her pale face emphasize her deep despair and captivity.",
              "The off-center framing visually isolates her empty downward look.",
              "The dirt floor is kept as a narrow lower-edge anchor to support the close facial framing."
            ],
            "creative_decisions": [
              "Positioned the camera slightly above eye level to geometrically match the visibility of the dirt floor at the lower frame edge.",
              "Described the chain only peripherally at the frame edge to adhere to the primary subject close-framing rule."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "chain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "doorway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "floor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "restraint anchor",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "wall",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "22431cde96107fab",
              "owned_hash": "826a8173f1c7ed48",
              "camera_direction_hash": "095572607386fe97",
              "owned_usage_hash": "ff7715d23a1535be",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 66,
        "dependency_reason": "동일한 숲 속 동굴 공간의 이전 샷 배경 연속성 유지 (단, 현재 샷은 인물 얼굴 중심의 close framing이므로 공간 참조는 바닥 일부로 최소화)",
        "_shot_index": 7,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 94,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From slightly above 김지후(강수리영)'s lowered eye line, complete the tilt toward a close view of her face while retaining a narrow strip of floor beneath the direction of her gaze. Tighten around the vacant eyes and lowered chin, placing her face off-center so the empty floorward look remains visually unresolved rather than meeting the lens.",
            "lighting_mood": "Natural ambient daylight appropriate to the cave is kept subdued and high-contrast around the vacant eyes, without introducing a specific unestablished source or color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L53B01",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cave_environment_and_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a natural forest cave features rough, uneven stone walls and a dirt floor. The space is dimly illuminated by subdued natural ambient daylight filtering in, creating a high-contrast, low-key lighting environment with deep, heavy shadows across the rocky surfaces.",
                "applies_to_shots": [
                  2,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "실내. 숲 속 동굴 - 낮",
                  "Natural ambient daylight appropriate to the cave setting is shaped in low-key contrast (Shot 2)",
                  "Natural ambient daylight appropriate to the cave is kept subdued and high-contrast (Shot 7)"
                ],
                "visual_inferences": [
                  "The cave has uneven, rugged rock walls and a natural dirt floor.",
                  "The daylight is very limited, resulting in deep shadows that obscure parts of the cave."
                ],
                "creative_decisions": [
                  "Using a very subdued, high-contrast lighting setup to visually reflect the grim captivity and despair of the characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 66,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "9782facf2afcb7f2"
      },
      {
        "scene_index": 95,
        "heading": "실외. 금월도 해안 절벽 - 낮",
        "beat_title": "바다를 바라보는 강영란",
        "representative_moment": "푸른 하늘과 바다를 배경으로 절벽 끝에 선 C06의 붉은 치마가 바람에 흩날린다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "static eye-level wide frame, bright natural daylight with restrained cinematic contrast",
            "t2i_prompt": "Photorealistic cinematic still. A static eye-level wide frame from the inland side faces out toward the sea. C06O08 in a traditional deep red shaman robe, an elderly Korean woman with distinct white hair, stands as a small full figure near the rugged coastal cliff edge in the lower-center frame. With her back to the camera and her weight settled toward the sea, she gazes into the distance. Bright natural daylight illuminates the clear blue sky and rolling blue sea that occupy the majority of the background. The vibrant red of her wind-lifted skirt creates a strong vertical accent against the vast horizontal blue landscape, her body volume clearly preserved under the bright sun. The abrupt seaward edge forms a narrow ground line directly beneath her feet.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "강영란(흰 머리 여자)",
              "붉은색 무녀복 차림",
              "금월도 해안 절벽 - 낮",
              "푸르른 하늘에 푸르게 넘실대는 바다를 배경으로 영란의 붉은 치마가 흩날린다",
              "절벽에 서서 바다를 바라본다"
            ],
            "visual_inferences": [
              "fixed_element yeong_ran_appearance: distinct white hair, vibrant red color of the garment",
              "fixed_element coastal_cliff_environment: rugged coastal cliff, bright natural daylight",
              "back to camera, weight settled toward sea, gazing into the distance"
            ],
            "creative_decisions": [
              "Framed C06 as a small full figure in a wide landscape to emphasize scale and the vastness of the environment",
              "Used the bright natural daylight to create a restrained cinematic contrast between the deep red robe and the blue sea/sky"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "10db789cf482cfd8",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "4503cfd7622701da",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 80,
        "dependency_reason": "금월도 해안 절벽의 배경 분위기 및 강영란의 무녀복 복장(fixed_elements) 연속성 유지",
        "_shot_index": 1,
        "visible_entities": [
          "C06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 95,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the inland side, hold a static eye-level wide frame facing out toward the sea, with 강영란(흰 머리 여자) appearing as a small full figure near the cliff edge and the sky and sea occupying most of the image. Her back and wind-lifted red skirt create the only strong vertical and moving accents within the broad horizontal landscape.",
            "lighting_mood": "Bright natural daylight holds the blue sky and sea against the deep red of the shaman robe with restrained cinematic contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "yeong_ran_appearance",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "A woman with distinct white hair is dressed in a traditional deep red shaman robe. The vibrant red color of her garment remains visually prominent and consistent.",
                "applies_to_shots": [
                  1,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "강영란(흰 머리 여자)",
                  "붉은색 무녀복 차림",
                  "deep red of the shaman robe"
                ],
                "visual_inferences": [
                  "The deep red color and traditional design of the shaman robe are consistent across the shots.",
                  "Her white hair serves as a strong identifying feature."
                ],
                "creative_decisions": [
                  "Emphasized the vivid red of the robe to create a striking contrast against the natural blue background."
                ],
                "confidence": "high"
              },
              {
                "element_id": "coastal_cliff_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor environment features a rugged coastal cliff set against a clear blue sky and vast sea. Bright natural daylight consistently illuminates the scene, maintaining a vibrant daytime atmosphere.",
                "applies_to_shots": [
                  1,
                  10,
                  18
                ],
                "element_scope": "full",
                "source_facts": [
                  "금월도 해안 절벽 - 낮",
                  "푸르른 하늘에 푸르게 넘실대는 바다",
                  "Bright natural daylight holds the blue sky and sea",
                  "cliff and sea"
                ],
                "visual_inferences": [
                  "The weather remains clear and sunny throughout the entire sequence.",
                  "The steep drop of the cliff and its proximity to the crashing ocean waves are constant environmental factors."
                ],
                "creative_decisions": [
                  "Used bright, high-contrast natural lighting to emphasize the harsh reality of the betrayal against an idyllic, beautiful backdrop."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 80,
                "shot_index": 56,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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": [],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "a3faf8a13b300677"
      },
      {
        "scene_index": 95,
        "heading": "실외. 금월도 해안 절벽 - 낮",
        "beat_title": "영란의 기습적인 칼날 배신",
        "representative_moment": "C06 drives a knife deep into the back of the young man, pushing her weight against him at the cliff edge.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Tight handheld medium frame at mid-torso height from a side-rear axis, stark high-contrast daytime lighting.",
            "t2i_prompt": "Photorealistic cinematic still. Captured at mid-torso height from a side-rear axis in a tight medium frame, torsos and arms occupying the space with lower legs implied beyond the bottom edge. An Asian young man in a dark fisher jacket occupies the near center at a three-quarter angle from the left, his torso arching forward from a severe impact, visibly wounded with a pained expression, looking off-screen. Pressed into the same depth plane directly behind him, C06O08 in a traditional deep red shaman robe, an Asian elderly woman, stands at a three-quarter angle from the right. She is exerting intense force, her body weight and both hands leaning hard into the handle of a knife. The knife blade is deeply embedded in the young man's back, the handle angled rearward into her firm grip, physically linking the two figures in the violent act. Bright natural daytime illumination renders the scene with stark contrast, emphasizing the vibrant deep red of the robe against the peripheral background of a rugged coastal cliff edge dropping obliquely toward the vast blue sea.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "강영란(흰 머리 여자), 붉은색 무녀복 차림",
              "순간, 푹!- 날카로운 칼날이 산들의 등을 파고든다.",
              "금월도 해안 절벽 - 낮",
              "푸르른 하늘에 푸르게 넘실대는 바다를 배경으로"
            ],
            "visual_inferences": [
              "The knife acts as a physical anchor connecting the two figures in the same depth plane.",
              "Mid-torso height camera placement focuses the tension entirely on the impact point and the physical struggle, rather than their full bodies."
            ],
            "creative_decisions": [
              "Used a tight medium frame to capture both the attacker's intense exertion and the victim's arched reaction in a single composition.",
              "Maintained the vivid deep red of the shaman robe against the blue coastal background to amplify the stark violence of the moment."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d1fb9cbe04d5f15f",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "7dc172ff1e4ed670",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 95,
        "dependency_reason": "Same scene continuous action, maintaining the bright daytime lighting, exact background of the cliff, and the ongoing interaction between the characters.",
        "_shot_index": 10,
        "visible_entities": [
          "C06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 95,
            "shot_index": 10
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At mid-torso height on 고산들's side-rear axis, hold a tight handheld medium frame at the exact instant the blade is buried in his back. 고산들 occupies the near center while 강영란(흰 머리 여자) is pressed into the same depth plane behind him, both hands and body weight driving through the handle; the cliffside remains only as peripheral context.",
            "lighting_mood": "Natural daytime illumination renders the impact with stark contrast while retaining the robe's deep red accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "yeong_ran_appearance",
                "element_type": "character_state",
                "character_name": "강영란",
                "description": "A woman with distinct white hair is dressed in a traditional deep red shaman robe. The vibrant red color of her garment remains visually prominent and consistent.",
                "applies_to_shots": [
                  1,
                  10
                ],
                "element_scope": "full",
                "source_facts": [
                  "강영란(흰 머리 여자)",
                  "붉은색 무녀복 차림",
                  "deep red of the shaman robe"
                ],
                "visual_inferences": [
                  "The deep red color and traditional design of the shaman robe are consistent across the shots.",
                  "Her white hair serves as a strong identifying feature."
                ],
                "creative_decisions": [
                  "Emphasized the vivid red of the robe to create a striking contrast against the natural blue background."
                ],
                "confidence": "high"
              },
              {
                "element_id": "coastal_cliff_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor environment features a rugged coastal cliff set against a clear blue sky and vast sea. Bright natural daylight consistently illuminates the scene, maintaining a vibrant daytime atmosphere.",
                "applies_to_shots": [
                  1,
                  10,
                  18
                ],
                "element_scope": "full",
                "source_facts": [
                  "금월도 해안 절벽 - 낮",
                  "푸르른 하늘에 푸르게 넘실대는 바다",
                  "Bright natural daylight holds the blue sky and sea",
                  "cliff and sea"
                ],
                "visual_inferences": [
                  "The weather remains clear and sunny throughout the entire sequence.",
                  "The steep drop of the cliff and its proximity to the crashing ocean waves are constant environmental factors."
                ],
                "creative_decisions": [
                  "Used bright, high-contrast natural lighting to emphasize the harsh reality of the betrayal against an idyllic, beautiful backdrop."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 95,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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": [],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "8a447d3337aac9aa"
      },
      {
        "scene_index": 95,
        "heading": "실외. 금월도 해안 절벽 - 낮",
        "beat_title": "절벽 아래로 추락하는 산들",
        "representative_moment": "치명상을 입은 고산들이 절벽 아래 바다를 향해 허공으로 추락하며 위를 올려다보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide framing from a lateral observation axis below the cliff edge, bright natural daylight",
            "t2i_prompt": "Photorealistic cinematic still. An Asian young man falls suspended mid-air in the center of the wide frame, with the sea below visible in the lower-center background. Captured from a lateral observation axis below and away from the cliff edge, his entire falling body has fully cleared the ledge, surrounded by open space above and below. The man is positioned at a three-quarter angle from the right, looking up with a visibly wounded, pained expression, his limbs splayed and clothing driven upward by the rapid descent. A rugged coastal cliff face runs vertically along one side of the frame under a clear blue sky. Bright natural daylight consistently illuminates the scene, keeping the falling silhouette clearly separated from the cliff and the water.",
            "outfit_assignments": [],
            "source_facts": [
              "산들은 비명도 채 못 지르고 높은 절벽을 떨어진다.",
              "분노와 공포, 황망함이 어우러진 표정의 산들이 멀어지는 것을 지켜보며…",
              "The outdoor environment features a rugged coastal cliff set against a clear blue sky and vast sea. Bright natural daylight consistently illuminates the scene."
            ],
            "visual_inferences": [
              "The character is suspended in mid-air away from the cliff face, limbs splayed to emphasize the sudden fall.",
              "Clothing is blown upward due to the downward velocity."
            ],
            "creative_decisions": [
              "Wide framing from a lateral, slightly low angle below the cliff edge to capture the scale of the fall.",
              "Bright, high-contrast natural daylight isolates the falling figure against the open sky and distant sea, enhancing the tragedy."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "aeac6b5c47343fb1",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "cbff2a4fd480bcb4",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 21,
        "dependency_reason": "금월도 해안 절벽 배경 및 자연광 조명 톤 등 이전 샷에서 확립된 환경과의 일관성 유지 (background continuity)",
        "_shot_index": 18,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 95,
            "shot_index": 18
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the lateral observation axis below and away from the cliff edge, begin a downward tilt only after 고산들 has fully cleared the ledge. Keep his entire falling body near the middle of the wide frame, with his clothing driven upward and open space maintained above and below to make the descent immediately legible.",
            "lighting_mood": "Natural daylight keeps the falling silhouette clearly separated from the cliff and sea.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "sea below",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "coastal_cliff_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor environment features a rugged coastal cliff set against a clear blue sky and vast sea. Bright natural daylight consistently illuminates the scene, maintaining a vibrant daytime atmosphere.",
                "applies_to_shots": [
                  1,
                  10,
                  18
                ],
                "element_scope": "full",
                "source_facts": [
                  "금월도 해안 절벽 - 낮",
                  "푸르른 하늘에 푸르게 넘실대는 바다",
                  "Bright natural daylight holds the blue sky and sea",
                  "cliff and sea"
                ],
                "visual_inferences": [
                  "The weather remains clear and sunny throughout the entire sequence.",
                  "The steep drop of the cliff and its proximity to the crashing ocean waves are constant environmental factors."
                ],
                "creative_decisions": [
                  "Used bright, high-contrast natural lighting to emphasize the harsh reality of the betrayal against an idyllic, beautiful backdrop."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 21,
                "shot_index": 10,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "3964a2a7a877f7a0"
      },
      {
        "scene_index": 96,
        "heading": "실내. 동굴 - 낮",
        "beat_title": "절망에 빠져 동굴 바닥에 묶인 수리영",
        "representative_moment": "어두운 동굴 바닥에 쇠사슬로 묶인 채 고개를 푹 숙인 C01의 절망적인 모습",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low-angle static observer framing with heavy contrast low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from a static camera positioned at floor height, C01O01 in casual clothes, a young Korean woman, occupies the lower middle of the frame in a three-quarter left angle. She is slumped seated on the rough ground of the cave chamber, her body collapsed and folded low, head bowed with her gaze looking down. A thick chain restraint wraps around her, its heavy iron links extending across the cave floor to anchor her firmly. The surrounding cave chamber is swallowed in deep, low-key ambient shadows, the heavy contrast isolating her bowed figure against the dark, damp rock formations without any visible light source.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "자포자기한 상태로 동굴에 묶여 있고",
              "어두운 동굴 바닥에 쇠사슬로 묶인 채",
              "slumped seated under chains",
              "gaze=down"
            ],
            "visual_inferences": [
              "fixed_element su_ri_young_captive_posture: She is sitting directly on the uneven, cold stone floor of the cave.",
              "fixed_element heavy_iron_chains: Thick, heavy iron chains wrapped around the captive woman, physically anchoring her to the ground.",
              "fixed_element dark_cave_interior: The surroundings consist of damp, rugged rock formations swallowed in deep shadows."
            ],
            "creative_decisions": [
              "Positioned the camera at floor height to emphasize her collapsed, helpless state and ground her in the lower frame.",
              "Used low-key ambient lighting with heavy contrast to compress her isolated figure within the unrefined stone walls."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cave chamber",
                "usage_kind": "anchor",
                "source_phrase": "rough ground of the cave chamber"
              },
              {
                "owned_token": "chain restraint",
                "usage_kind": "anchor",
                "source_phrase": "A thick chain restraint wraps around her"
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage opening",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "648935f72836adea",
              "owned_hash": "57e172fbde4887e5",
              "camera_direction_hash": "da61974d07ae978c",
              "owned_usage_hash": "1b1bda1f46cfe89d",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "cave chamber",
                  "violating_phrase": "rough ground of the cave chamber",
                  "reason": "The prompt uses the cave chamber as a physical environment anchor to position the character, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "chain_restraint",
                  "violating_phrase": "A thick chain restraint wraps around her",
                  "reason": "The prompt describes the chain restraint's path and spatial positioning relative to the character without redesigning or adding a new object, matching the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 76,
        "dependency_reason": "동일한 장소(동굴 내부)이므로 이전 샷(S76_Shot5)의 배경 요소와 연속성을 유지해야 함",
        "_shot_index": 1,
        "visible_entities": [
          "C01",
          "L35",
          "P18"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 96,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Place the static camera at floor height directly in front of 김지후(강수리영), far enough back to contain her full seated body and the visible run of chain. She occupies the lower middle of the wide frame with her bowed head and collapsed posture compressed against the surrounding cave space.",
            "lighting_mood": "Low-key ambient illumination appropriate to the dark cave leaves her bowed figure in heavy contrast without specifying an unseen source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "L35",
              "P18"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cave chamber",
              "chain restraint",
              "lantern",
              "passage",
              "passage opening"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "su_ri_young_captive_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young Korean woman seated on the rough ground of a dark cave, physically restrained. Her body is collapsed and folded low to the floor in a helpless, slumped posture, unable to stand and bearing the weight of her captivity.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "자포자기한 상태로 동굴에 묶여 있고",
                  "어두운 동굴 바닥에 쇠사슬로 묶인 채",
                  "바닥에 주저앉은 수리영",
                  "slumped seated under chains",
                  "folded on the lower-left floor"
                ],
                "visual_inferences": [
                  "She is sitting directly on the uneven, cold stone floor of the cave.",
                  "Her limbs are restricted, forcing her to stay close to the ground."
                ],
                "creative_decisions": [
                  "Keep her clothing slightly dirtied from the cave floor to emphasize her vulnerable, captive condition."
                ],
                "confidence": "high"
              },
              {
                "element_id": "heavy_iron_chains",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "Thick, heavy iron chains wrapped around the captive woman, extending down to the cavern floor. The dark, rusted metal links physically anchor her to the ground, firmly preventing any escape.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "굵은 쇠사슬",
                  "쇠사슬로 묶인 채",
                  "seated under chains"
                ],
                "visual_inferences": [
                  "The chains are thick, industrial, or ancient in design, heavy enough to effectively immobilize a person.",
                  "They are visibly fastened to the stone floor or wall behind her."
                ],
                "creative_decisions": [
                  "Highlight the cold, metallic texture of the chains against the dark background to emphasize inescapable confinement."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_cave_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a dark, unrefined stone cave. The surroundings consist of damp, rugged rock formations and a hard, uneven ground, swallowed in deep, low-key shadows without natural daylight.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "실내. 동굴 - 낮",
                  "어두운 동굴 바닥",
                  "dark cave",
                  "surrounding cave space",
                  "low-key ambient illumination"
                ],
                "visual_inferences": [
                  "The walls are made of jagged, unpolished natural rock.",
                  "There is no natural sunlight reaching this depth of the cave, making artificial light sources essential."
                ],
                "creative_decisions": [
                  "Keep the deep background completely obscured by pitch-black shadows, focusing the heavy contrast on the immediate foreground."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 76,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L35B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "6742ecc02b7cff9c"
      },
      {
        "scene_index": 96,
        "heading": "실내. 동굴 - 낮",
        "beat_title": "백 년을 기다린 제물임을 밝히는 영란",
        "representative_moment": "등불을 든 영란이 쇠사슬에 묶인 채 주저앉은 수리영을 만족스럽게 내려다보는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "waist-height side angle, wide profile composition, low-key contrast with warm lantern light",
            "t2i_prompt": "Photorealistic cinematic still. Captured by a waist-height side camera, C01O01 in casual clothes, a young Korean woman, sits collapsed in the lower-left foreground of the pre-existing cave chamber, looking toward the elderly Korean woman above her in the middle-right. They share the same dark stone floor space. The elderly Korean woman with white hair stands in left profile, leaning slightly over the captive, eyes fixed on C01O01. C01O01 remains in right profile, seated on the rough ground in a helpless, slumped posture, positioned near the pre-existing chain restraint. The elderly woman holds the pre-existing lantern beside her, its warm light facing the seated captive. The lantern light lifts both profiles from the pitch-black shadows, highlighting the cold metallic texture of the pre-existing chain restraint, while the damp rock formations of the background remain swallowed in deep, low-key contrast.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "자포자기한 상태로 동굴에 묶여 있고",
              "등불을 든 영란이 들어온다",
              "바닥에 주저앉은 수리영을 만족스레 내려다본다"
            ],
            "visual_inferences": [
              "C01 is collapsed on the rough stone floor in a helpless posture",
              "the thick chains physically anchor C01 to the ground",
              "the lantern light creates strong contrast against the dark cave walls"
            ],
            "creative_decisions": [
              "Waist-height side camera placement emphasizes the power imbalance between the standing figure and the seated captive",
              "Low-key lighting with pitch-black shadows heightens the suspense and isolation of the cave"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cave chamber",
                "usage_kind": "anchor",
                "source_phrase": "sits collapsed in the lower-left foreground of the pre-existing cave chamber"
              },
              {
                "owned_token": "chain restraint",
                "usage_kind": "anchor",
                "source_phrase": "positioned near the pre-existing chain restraint"
              },
              {
                "owned_token": "lantern",
                "usage_kind": "anchor",
                "source_phrase": "holds the pre-existing lantern beside her"
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage opening",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6397f69fc1a31461",
              "owned_hash": "57e172fbde4887e5",
              "camera_direction_hash": "fa16069786f2697d",
              "owned_usage_hash": "7a8337a42734756a",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "cave_chamber",
                  "violating_phrase": "sits collapsed in the lower-left foreground of the pre-existing cave chamber",
                  "reason": "The prompt references the pre-existing cave chamber as a spatial anchor to position the character without altering or recreating the background environment, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "chain_restraint",
                  "violating_phrase": "positioned near the pre-existing chain restraint",
                  "reason": "The prompt uses the pre-existing chain restraint as a spatial anchor and describes lighting casting on its texture without requesting any redraw or modification.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "lantern",
                  "violating_phrase": "holds the pre-existing lantern beside her",
                  "reason": "The character physically holds the pre-existing lantern to cast light, which represents an allowed physical interaction with a prop without redesigning its appearance.",
                  "verdict": "allowed_prop_contact"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 96,
        "dependency_reason": "같은 공간(동굴 내부)에서의 연속된 상황이므로 배경 톤과 묶여있는 수리영의 자세, 쇠사슬 등의 위치 정보를 일관되게 유지해야 함",
        "_shot_index": 4,
        "visible_entities": [
          "C01",
          "L35"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 96,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At waist height from the side of the confrontation, settle the tracking move into a wide profile composition that preserves the vertical imbalance between the two women. 강영란(흰 머리 여자) occupies the middle-right above 김지후(강수리영), who remains folded on the lower-left floor, while the held lantern stays beside 영란 without obscuring either face.",
            "lighting_mood": "The held lantern lifts both profiles from the dark cave while leaving the surrounding space in low-key contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "looks_toward",
                  "gesture_target_label": "강영란(흰 머리 여자) above her",
                  "label": "김지후(강수리영)",
                  "screen_zone": "lower_left",
                  "target_id": "C01",
                  "target_kind": "character"
                }
              ]
            },
            "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",
              "L35"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cave chamber",
              "chain restraint",
              "lantern",
              "passage",
              "passage opening"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "su_ri_young_captive_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "A young Korean woman seated on the rough ground of a dark cave, physically restrained. Her body is collapsed and folded low to the floor in a helpless, slumped posture, unable to stand and bearing the weight of her captivity.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "자포자기한 상태로 동굴에 묶여 있고",
                  "어두운 동굴 바닥에 쇠사슬로 묶인 채",
                  "바닥에 주저앉은 수리영",
                  "slumped seated under chains",
                  "folded on the lower-left floor"
                ],
                "visual_inferences": [
                  "She is sitting directly on the uneven, cold stone floor of the cave.",
                  "Her limbs are restricted, forcing her to stay close to the ground."
                ],
                "creative_decisions": [
                  "Keep her clothing slightly dirtied from the cave floor to emphasize her vulnerable, captive condition."
                ],
                "confidence": "high"
              },
              {
                "element_id": "heavy_iron_chains",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "Thick, heavy iron chains wrapped around the captive woman, extending down to the cavern floor. The dark, rusted metal links physically anchor her to the ground, firmly preventing any escape.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "close",
                "source_facts": [
                  "굵은 쇠사슬",
                  "쇠사슬로 묶인 채",
                  "seated under chains"
                ],
                "visual_inferences": [
                  "The chains are thick, industrial, or ancient in design, heavy enough to effectively immobilize a person.",
                  "They are visibly fastened to the stone floor or wall behind her."
                ],
                "creative_decisions": [
                  "Highlight the cold, metallic texture of the chains against the dark background to emphasize inescapable confinement."
                ],
                "confidence": "high"
              },
              {
                "element_id": "dark_cave_interior",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a dark, unrefined stone cave. The surroundings consist of damp, rugged rock formations and a hard, uneven ground, swallowed in deep, low-key shadows without natural daylight.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "실내. 동굴 - 낮",
                  "어두운 동굴 바닥",
                  "dark cave",
                  "surrounding cave space",
                  "low-key ambient illumination"
                ],
                "visual_inferences": [
                  "The walls are made of jagged, unpolished natural rock.",
                  "There is no natural sunlight reaching this depth of the cave, making artificial light sources essential."
                ],
                "creative_decisions": [
                  "Keep the deep background completely obscured by pitch-black shadows, focusing the heavy contrast on the immediate foreground."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 96,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L35B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "764c205cf65e0c74"
      },
      {
        "scene_index": 97,
        "heading": "Scene 97",
        "beat_title": "The Pierced Shadow",
        "representative_moment": "A white antler spear tip erupts through the center of a black, smoke-like figure's back directly toward the lens.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extremely close up behind the upper torso, objective historical-memory perception, muted and aged daylight",
            "t2i_prompt": "Photorealistic cinematic still. An extremely close shot from behind a dark, smoke-like humanoid figure at upper-torso height, with its back to the camera, the torso recoiling in a state of severe injury. A white antler spear tip erupts directly through the center of the dark back, the sharp point facing straight toward the lens. The protruding white bone point remains sharply focused in the center of the frame, cutting sharply against the surrounding black form that fills the frame edges to supply scale and context. The figure is looking away off-screen. The outdoor natural lighting is rendered with a restrained, aged historical texture, featuring muted, desaturated tones and soft light characteristic of a faded memory, leaving the absent background in soft obscurity.",
            "outfit_assignments": [],
            "source_facts": [
              "Shot description: A white antler spear tip erupts through the back of the black smoke figure.",
              "DP instruction: Camera extremely close behind the figure at upper-torso height, the spear point centered toward the lens.",
              "Fixed element: The outdoor environment is bathed in a consistent historical daylight atmosphere with muted, desaturated tones."
            ],
            "visual_inferences": [
              "The figure's torso recoils to visually convey the severe physical injury of the piercing impact.",
              "The background is rendered as a soft, out-of-focus void to emphasize the close framing and eliminate extraneous details."
            ],
            "creative_decisions": [
              "Placed the white antler tip dead center to maximize the objective historical-memory impact and scale.",
              "Applied a faded, soft light grading to visually ground the scene as a flashback sequence without breaking the photorealistic texture."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "27f452d24ff9cb15",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "eae0c32012be19db",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": -1,
        "dependency_reason": "No prior visual dependency explicitly mentioned for this specific frame.",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 97,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "In an objective historical-memory image, place the camera extremely close behind 그분(검은 연기 형체) at upper-torso height, aligned directly with the white antler spear tip as it erupts toward the lens. The protruding point remains centered while the pierced back and surrounding black form supply enough edge context to preserve impact direction and scale.",
            "lighting_mood": "Daylight is rendered with a restrained, aged historical texture while the white spear point cuts sharply against the black form.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "aged_historical_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor environment is bathed in a consistent historical daylight atmosphere. The natural lighting is rendered with muted, desaturated tones and an aged texture to explicitly establish the somber, vintage setting of the past across all framing sizes.",
                "applies_to_shots": [
                  1,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Daylight is rendered with a restrained, aged historical texture",
                  "Historical daylight falls away around the face",
                  "Natural historical daylight is graded with muted, aged tones"
                ],
                "visual_inferences": [
                  "The entire outdoor setting in front of the warehouse maintains this consistent vintage color grading to visually connect the disparate close-ups and the wider geographical view."
                ],
                "creative_decisions": [
                  "Using a unified muted and aged color palette to clearly establish the historical memory sequence, ensuring the supernatural events feel visually grounded in the past."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "f18a11ef9a3e280d"
      },
      {
        "scene_index": 97,
        "heading": "실외. 갈대숲 창고 앞 - 낮(과거)",
        "beat_title": "황금빛 눈으로 변하는 촌주의 빙의 순간",
        "representative_moment": "An East Asian elderly man clutches his throat, his eyes flashing an eerie golden color.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up on a frontal axis, muted historical daylight grading with high contrast on golden pupils",
            "t2i_prompt": "Photorealistic cinematic still. An East Asian elderly man facing the camera, gazing into the distance, his face dominating the extreme close-up on an eye-level frontal axis. His explicitly golden pupils glow intensely in the exact center of the frame as an isolated supernatural color accent. His chin is tensed, with a tightened hand clutching his throat partially visible along the lower frame boundary. Muted, desaturated historical daylight falls away into deep shadow around the edges of his face, rendering a somber, aged vintage texture. The immediate surroundings behind him are reduced to a soft, completely out-of-focus background.",
            "outfit_assignments": [],
            "source_facts": [
              "S97 action: '촌주의 눈이 황금빛으로 변한다.'",
              "shot description: 'clutching throat, chin tensed, gazing into the distance, golden pupils'",
              "observer POV, memory perception mode"
            ],
            "visual_inferences": [
              "fixed_element aged_historical_daylight: muted, desaturated tones and an aged texture",
              "Extreme close-up isolates the face and the hand at the throat, making the background a soft blur per close framing rules"
            ],
            "creative_decisions": [
              "Centered the golden eyes perfectly in the frame to emphasize the supernatural possession",
              "Deepened the shadows around the edge of the face to allow the golden pupils to act as the sole vivid color accent"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "dcd357896b497170",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "1655759449bc0606",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": 97,
        "dependency_reason": "Maintains the historical daylight tone and character state from the previous shot within the same scene sequence.",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 97,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Hold an extremely close, eye-level view directly before 조선인 촌주, using the frontal axis as a supernatural confrontation rather than a neutral portrait. Both eyes occupy the center of the close frame at the exact flash of transformation, while his tightened hand and throat remain partially visible along the lower boundary as contextual evidence.",
            "lighting_mood": "Historical daylight falls away around the face as the explicitly golden pupils become the shot's isolated supernatural color accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "aged_historical_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor environment is bathed in a consistent historical daylight atmosphere. The natural lighting is rendered with muted, desaturated tones and an aged texture to explicitly establish the somber, vintage setting of the past across all framing sizes.",
                "applies_to_shots": [
                  1,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Daylight is rendered with a restrained, aged historical texture",
                  "Historical daylight falls away around the face",
                  "Natural historical daylight is graded with muted, aged tones"
                ],
                "visual_inferences": [
                  "The entire outdoor setting in front of the warehouse maintains this consistent vintage color grading to visually connect the disparate close-ups and the wider geographical view."
                ],
                "creative_decisions": [
                  "Using a unified muted and aged color palette to clearly establish the historical memory sequence, ensuring the supernatural events feel visually grounded in the past."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 97,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "3e3d6022f166b2d1"
      },
      {
        "scene_index": 97,
        "heading": "실외. 갈대숲 창고 앞 - 낮(과거)",
        "beat_title": "짐승처럼 변해버린 생존자들의 포식",
        "representative_moment": "과거의 낡은 창고 앞 흙바닥에서, 짐승처럼 돌변한 조선인 생존자들이 피투성이가 된 일본군 시신을 물어뜯고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide chest-height observer view, muted and desaturated historical memory grading",
            "t2i_prompt": "Photorealistic cinematic still. A wide observer view at chest height across a dirt ground. In the foreground to midground, multiple crouched East Asian villagers in worn historical attire, seen in right profile, are bent over like beasts. Their teeth are sunk deeply into the bodies beneath them, eyes fixed downward on the flesh. Below them lie motionless East Asian men in vintage military uniforms, sprawled at three-quarter angles from the left with eyes closed, lifeless. Restrained deep-red blood accents coat the bodies, contrasting sharply with the muted, desaturated tones of the aged historical daylight bathing the scene. In the background, an old wooden warehouse faces the feeding ground, surrounded by a dense reed field.",
            "outfit_assignments": [],
            "source_facts": [
              "창고에서 나온 조선인들이 죽어 널부러진 일본군 시체를 걸신 들린 짐승떼처럼 마구잡이로 뜯어먹고 있다.",
              "과거의 조선인 육혈귀 생존자들이 피투성이가 된 일본군 병사들의 시신에 짐승처럼 이빨을 깊게 박아넣은 찰나"
            ],
            "visual_inferences": [
              "fixed_element: aged_historical_daylight applied across the environment with muted, desaturated tones",
              "DP instruction: chest height wide view, overlapping crouched bodies arranged from foreground to midground",
              "Korean survivors described as East Asian villagers in historical attire, Japanese soldiers as East Asian men in vintage military uniforms"
            ],
            "creative_decisions": [
              "Framed the shot widely at chest height to capture both the sheer number of overlapping bodies and the warehouse in the background, anchoring the scale of the massacre.",
              "Used the deep-red blood solely as an accent color to stand out vividly against the otherwise faded and desaturated historical memory palette."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "639835df9fc1c0fa",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "e5596a8cbc8420d7",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "flashback",
        "dependent_scene_index": -1,
        "dependency_reason": "N/A",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 97,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the retreat at chest height in a wide historical-memory view facing the area before the warehouse, lowering the composition enough to hold the feeding survivors and the soldiers' bodies together across the ground. Arrange overlapping crouched and kneeling bodies from foreground to midground, with the warehouse behind them as a fixed scale reference and no single corpse overwhelming the frame.",
            "lighting_mood": "Natural historical daylight is graded with muted, aged tones while the bloodied bodies supply the restrained deep-red accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "aged_historical_daylight",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The outdoor environment is bathed in a consistent historical daylight atmosphere. The natural lighting is rendered with muted, desaturated tones and an aged texture to explicitly establish the somber, vintage setting of the past across all framing sizes.",
                "applies_to_shots": [
                  1,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Daylight is rendered with a restrained, aged historical texture",
                  "Historical daylight falls away around the face",
                  "Natural historical daylight is graded with muted, aged tones"
                ],
                "visual_inferences": [
                  "The entire outdoor setting in front of the warehouse maintains this consistent vintage color grading to visually connect the disparate close-ups and the wider geographical view."
                ],
                "creative_decisions": [
                  "Using a unified muted and aged color palette to clearly establish the historical memory sequence, ensuring the supernatural events feel visually grounded in the past."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 97,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "c03903ee079c1bea"
      },
      {
        "scene_index": 98,
        "heading": "100. 다시 동굴 - 낮",
        "beat_title": "Suri-young's explosive fury in chains",
        "representative_moment": "C01 screams in anger at the off-screen figure, her tearful face and taut chains tightly framed under harsh light.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level frontal close framing, low-key ambient lighting with severe high contrast",
            "t2i_prompt": "Photorealistic cinematic still. C01O01 in a casual top, a pale young Korean woman, faces the camera in an eye-level frontal close framing, her tear-filled face occupying most of the frame. Her head thrusts forward with her mouth open mid-shout, eyes fixed off-screen just past the lens. A partial run of heavy iron links leads downward from her torso at the lower frame edge, the metal pulled taut against her forward-straining body. Low-key ambient illumination catches her tears, taut facial muscles, and the metallic glints of the chain in severe high contrast, with the immediate frame-edge [: rough natural stone surface] completely swallowed in pitch-black shadow.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "수리영은 분노와 원망 가득, 눈물 글썽한 눈으로 영란을 노려본다.",
              "난 김지후라고!! ... 떠들지도 말라고!! (수리영이 다시 흐느낀다.)",
              "DP instruction: Track laterally into an eye-level frontal close position on 김지후, stopping with her tear-filled face occupying most of the frame.",
              "DP instruction: Her head thrusts toward 강영란's off-screen position, mouth open mid-shout and eyes locked just past the lens rather than into it.",
              "DP instruction: A partial run of links leads downward from 김지후's body."
            ],
            "visual_inferences": [
              "fixed_element iron_restraining_chains: heavy iron links pulled taut catching faint metallic glints",
              "fixed_element cave_ambient_lighting: low-key ambient illumination with stark highlights",
              "Because background reference is skipped in close framing, the immediate background edge is defined as a rough stone surface dissolving into shadow."
            ],
            "creative_decisions": [
              "Utilized a tight close framing to maximize the emotional intensity of C01's tearful rage.",
              "Placed the taut iron chains at the very bottom of the frame to anchor her physical restraint without cluttering the facial focus.",
              "Applied severe high-contrast lighting to isolate her strained expression from the pitch-black cave surroundings."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cave chamber",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chain restraint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage opening",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f0cf3ba3056d09a9",
              "owned_hash": "57e172fbde4887e5",
              "camera_direction_hash": "315034c2567882f4",
              "owned_usage_hash": "1bc7ad8d54f98e64",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 96,
        "dependency_reason": "Maintains the low-key, high-contrast cave lighting and taut iron chains from the prior scene, adapted tightly for a close-up framing.",
        "_shot_index": 2,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 98,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track laterally into an eye-level frontal close position on 김지후(강수리영), stopping with her tear-filled face occupying most of the frame while retaining a narrow trace of chains and cave context below. Her head thrusts toward 강영란(흰 머리 여자)'s off-screen position, mouth open mid-shout and eyes locked just past the lens rather than into it.",
            "lighting_mood": "Low-key ambient cave illumination catches the tears and open mouth in high contrast without defining an unmentioned source or color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L35B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cave_ambient_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the cave features low-key, high-contrast ambient illumination with an unspecified source. Deep shadows obscure the surrounding rough cave walls, casting harsh, stark highlights on the subjects to emphasize the oppressive and dark atmosphere of the confined space.",
                "applies_to_shots": [
                  2,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key ambient cave illumination catches the tears and open mouth in high contrast without defining an unmentioned source",
                  "Low-key ambient cave illumination shapes his strained face and taut body with severe contrast",
                  "Low-key, high-contrast illumination isolates her controlled expression"
                ],
                "visual_inferences": [
                  "The surrounding environment consists of rough, natural stone surfaces that mostly recede into pitch-black shadow."
                ],
                "creative_decisions": [
                  "Using a high-contrast, restrictive tonal palette to visually isolate the characters and heighten the dramatic tension of their confrontation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "iron_restraining_chains",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "Heavy, thick iron chains are used to tightly secure the captives within the cave. The metal links are pulled taut as the prisoners strain diagonally against them, catching faint, high-contrast metallic glints from the surrounding low-key light.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "retaining a narrow trace of chains",
                  "straining forward against chains",
                  "restrained in place as he shouts",
                  "drives diagonally against the chain"
                ],
                "visual_inferences": [
                  "The chains are weathered and heavy, anchored firmly to unseen points in the dark background of the cave to prevent escape."
                ],
                "creative_decisions": [
                  "Highlighting the physical tension of the taut chains to parallel the emotional desperation and forceful resistance of the captive characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 96,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "c539274d93a20130"
      },
      {
        "scene_index": 98,
        "heading": "100. 다시 동굴 - 낮",
        "beat_title": "분노와 절망 속에 절규하는 인우",
        "representative_moment": "C03가 쇠사슬에 묶인 채 허공을 향해 몸을 던지듯 앞으로 내밀며 분노에 차 소리치고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height wide observation, high-contrast low-key illumination",
            "t2i_prompt": "Photorealistic cinematic still. From an observer's waist height at a distance, C03O04 in a dark fishing suit, an Asian young man with short black hair, faces the camera, lunging forward with bent knees and a pitched torso. He strains diagonally against the pre-existing chain restraint. His neck veins bulge, his mouth open wide shouting toward someone off-screen. The rough cave floor grounds his wide stance, while the enclosed rough stone cave chamber walls recede behind him. Low-key, high-contrast ambient illumination shapes his taut figure and strained face, catching faint metallic glints on the pre-existing chain restraint while deep shadows swallow the surrounding environment.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "shot description: 정인우 restrained in place as he shouts toward 강영란 off screen",
              "shot description: His body drives diagonally against the chain despite the frontal camera axis, with bent knees and a pitched torso",
              "S100 action: 인우 '당신 미쳤어!!'"
            ],
            "visual_inferences": [
              "fixed_element cave_ambient_lighting: low-key, high-contrast ambient illumination, deep shadows obscuring rough walls",
              "fixed_element iron_restraining_chains: taut heavy iron chains pulled diagonally, metallic glints",
              "waist-height viewpoint emphasizes the floor beneath his feet and the horizontal tension of the chains"
            ],
            "creative_decisions": [
              "Positioned the camera at waist height to clearly display the full body stance and the physical strain against the chains across the lower frame",
              "Applied severe contrast to isolate C03's expression and body tension from the dark, oppressive background"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cave chamber",
                "usage_kind": "anchor",
                "source_phrase": "enclosed rough stone cave chamber walls recede behind him"
              },
              {
                "owned_token": "chain restraint",
                "usage_kind": "anchor",
                "source_phrase": "strains diagonally against the pre-existing chain restraint"
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage opening",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5e9cead8f585c51a",
              "owned_hash": "57e172fbde4887e5",
              "camera_direction_hash": "d356dbdbc6ccbea8",
              "owned_usage_hash": "c02fcbeece3ace8c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "cave chamber",
                  "violating_phrase": "enclosed rough stone cave chamber walls recede behind him",
                  "reason": "The prompt uses the cave chamber walls as a spatial background anchor, matching the producer's 'anchor' declaration with no redraw indicators.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "chain restraint",
                  "violating_phrase": "strains diagonally against the pre-existing chain restraint",
                  "reason": "The prompt refers to the chain restraint as a pre-existing spatial anchor for the character's straining action, matching the producer's 'anchor' declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 96,
        "dependency_reason": "exact background reference required for the same cave environment",
        "_shot_index": 5,
        "visible_entities": [
          "C03",
          "L35"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 98,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At waist height and a wide viewing distance, hold a static frontal full-body composition of 정인우 restrained in place as he shouts toward 강영란(흰 머리 여자) off screen. His body drives diagonally against the chain despite the frontal camera axis, with bent knees and a pitched torso preventing the frame from reading as a formal portrait.",
            "lighting_mood": "Low-key ambient cave illumination shapes his strained face and taut body with severe contrast while leaving the source unspecified.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "L35"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "cave chamber",
              "chain restraint",
              "lantern",
              "passage",
              "passage opening"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cave_ambient_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the cave features low-key, high-contrast ambient illumination with an unspecified source. Deep shadows obscure the surrounding rough cave walls, casting harsh, stark highlights on the subjects to emphasize the oppressive and dark atmosphere of the confined space.",
                "applies_to_shots": [
                  2,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key ambient cave illumination catches the tears and open mouth in high contrast without defining an unmentioned source",
                  "Low-key ambient cave illumination shapes his strained face and taut body with severe contrast",
                  "Low-key, high-contrast illumination isolates her controlled expression"
                ],
                "visual_inferences": [
                  "The surrounding environment consists of rough, natural stone surfaces that mostly recede into pitch-black shadow."
                ],
                "creative_decisions": [
                  "Using a high-contrast, restrictive tonal palette to visually isolate the characters and heighten the dramatic tension of their confrontation."
                ],
                "confidence": "high"
              },
              {
                "element_id": "iron_restraining_chains",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "Heavy, thick iron chains are used to tightly secure the captives within the cave. The metal links are pulled taut as the prisoners strain diagonally against them, catching faint, high-contrast metallic glints from the surrounding low-key light.",
                "applies_to_shots": [
                  2,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "retaining a narrow trace of chains",
                  "straining forward against chains",
                  "restrained in place as he shouts",
                  "drives diagonally against the chain"
                ],
                "visual_inferences": [
                  "The chains are weathered and heavy, anchored firmly to unseen points in the dark background of the cave to prevent escape."
                ],
                "creative_decisions": [
                  "Highlighting the physical tension of the taut chains to parallel the emotional desperation and forceful resistance of the captive characters."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 96,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
              },
              {
                "kind": "background",
                "id": "L35B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "1b8ac3c5e5718c70"
      },
      {
        "scene_index": 98,
        "heading": "다시 동굴 - 낮",
        "beat_title": "정인우의 비난과 영란의 냉소",
        "representative_moment": "C06이 시니컬한 미소를 지은 채 차갑게 아래를 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Slight upward tilt from a low angle, holding at close distance on the subject's face",
            "t2i_prompt": "Photorealistic cinematic still. C06O08 in a red shaman robe, an Asian woman in her 60s, occupies the central two-thirds of the frame in a three-quarter left composition, her head and shoulders filling the upper area. Viewed from a slight upward tilt, her chin is lowered with a lingering cynical smile, her eyes angled straight down toward the lower edge where an off-screen figure remains. Low-key, high-contrast ambient illumination shapes her restrained expression, casting stark highlights across her neatly tied hair and refined facial features. Behind her, [: rough natural stone surfaces of the cave interior recede immediately into pitch-black shadow].",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "source_facts": [
              "S98 Shot 6 description: 정인우의 비난에 시니컬한 미소를 지은 채 김지후(강수리영)를 차갑게 내려다보는 강영란(흰 머리 여자)의 얼굴.",
              "DP direction: From approximately Ji-hoo's eye level, slight upward tilt toward Young-ran, eyes angled toward the lower edge."
            ],
            "visual_inferences": [
              "fixed_element cave_ambient_lighting: Low-key, high-contrast ambient illumination, casting stark highlights on the subject",
              "Stable traits incorporated: neatly tied hair and refined facial features",
              "Close framing omits distant cave walls, focusing on immediate frame-edge shadows"
            ],
            "creative_decisions": [
              "Positioned the subject's head in the upper area of the frame to geometrically align with the low-angle upward tilt.",
              "Used heavy shadows immediately behind the character to adhere to the skipped_close_framing rule and isolate her expression."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "cave chamber",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chain restraint",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "passage opening",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "830fb76bf146d9fe",
              "owned_hash": "57e172fbde4887e5",
              "camera_direction_hash": "231b2e3079738771",
              "owned_usage_hash": "1bc7ad8d54f98e64",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 98,
        "dependency_reason": "동일한 씬 내의 환경 및 조명 연속성 (close framing 으로 인해 배경 참조는 제외됨)",
        "_shot_index": 6,
        "visible_entities": [
          "C06"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 98,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From approximately 김지후(강수리영)'s eye level, the completed dolly-in holds at close distance with a slight upward tilt toward 강영란(흰 머리 여자). Her face occupies roughly the central two-thirds in a three-quarter composition; the cynical smile sits beneath eyes angled toward the lower edge where 김지후(강수리영) remains off-screen.",
            "lighting_mood": "Low-key, high-contrast illumination isolates her controlled expression while retaining the restrained tonal palette.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O08"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L35B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "cave_ambient_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of the cave features low-key, high-contrast ambient illumination with an unspecified source. Deep shadows obscure the surrounding rough cave walls, casting harsh, stark highlights on the subjects to emphasize the oppressive and dark atmosphere of the confined space.",
                "applies_to_shots": [
                  2,
                  5,
                  6
                ],
                "element_scope": "full",
                "source_facts": [
                  "Low-key ambient cave illumination catches the tears and open mouth in high contrast without defining an unmentioned source",
                  "Low-key ambient cave illumination shapes his strained face and taut body with severe contrast",
                  "Low-key, high-contrast illumination isolates her controlled expression"
                ],
                "visual_inferences": [
                  "The surrounding environment consists of rough, natural stone surfaces that mostly recede into pitch-black shadow."
                ],
                "creative_decisions": [
                  "Using a high-contrast, restrictive tonal palette to visually isolate the characters and heighten the dramatic tension of their confrontation."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 98,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "63fcd2582f3789aa"
      },
      {
        "scene_index": 99,
        "heading": "101. 실내. 해안마을 경찰 지구대 - 낮",
        "beat_title": "한가롭게 게임을 하는 소장 구창모",
        "representative_moment": "밝은 지구대 안, 구창모가 의자에 느긋하게 기대앉아 핸드폰 화면을 들여다보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A static wide view from seated eye level with bright daytime illumination and neutral color treatment",
            "t2i_prompt": "Photorealistic cinematic still. A static wide view from seated eye level. An Asian middle-aged man in a police uniform occupies one side of the midground, positioned at three-quarter angle from the right. He is reclining deep in a chair, its back facing diagonally toward the camera while supporting his relaxed body. His gaze is looking down, eyes fixed on a smartphone held in his hands. The active screen of the smartphone faces him and is seen obliquely by the camera. The near edge and top plane of the desk are visible beside him. Bright daytime station illumination floods the interior with restrained contrast and a neutral color treatment, emphasizing the open room space around his immediate workspace.",
            "outfit_assignments": [],
            "source_facts": [
              "S101 action: 느긋하게 앉아 핸드폰 게임을 하는 창모.",
              "shot description: 밝은 지구대 안에서 구창모가 의자에 느긋하게 기대앉아 핸드폰 화면을 들여다보는 모습."
            ],
            "visual_inferences": [
              "fixed_element police_station_daytime_environment: bright daytime illumination, neutral color treatment",
              "Gu Chang-mo rendered as an Asian middle-aged man with a demographic descriptor since no entity ID is registered."
            ],
            "creative_decisions": [
              "Wide framing from seated eye level to show the relaxed environment and leave room for the upcoming narrative pan.",
              "Placed the desk and chair in relation to the man to anchor his midground position securely."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "anchor",
                "source_phrase": "The near edge and top plane of the desk are visible beside him"
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "landline telephone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelving",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "redraw",
                "source_phrase": "eyes fixed on a smartphone held in his hands. The active screen of the smartphone faces him"
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8659d309ab875d9d",
              "owned_hash": "2be92b3d8e0380c9",
              "camera_direction_hash": "c86ba08ab29fd27a",
              "owned_usage_hash": "dbd871f9680962ce",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "desk",
                  "violating_phrase": "The near edge and top plane of the desk are visible beside him",
                  "reason": "The desk is only referenced for spatial anchoring and composition, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "smartphone",
                  "violating_phrase": "a smartphone held in his hands. The active screen of the smartphone faces him",
                  "reason": "The prompt describes the physical holding geometry and orientation of the smartphone being held and used, which meets all criteria for the allowed prop contact exception.",
                  "verdict": "allowed_prop_contact"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 3,
        "dependency_reason": "previous_shot_refs indicates a dependency on scene_index 3 for location reference",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 99,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static wide view from seated eye level places 구창모 reclining with his chair and immediate workspace clearly legible around him. He occupies one side of the midground, his raised phone kept at a natural scale while open room space anticipates the coming pan toward the nearby officer.",
            "lighting_mood": "Bright daytime station illumination keeps the relaxed setup plainly visible with restrained contrast and neutral color treatment.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L03B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "counter",
              "desk",
              "door",
              "landline telephone",
              "shelving",
              "smartphone",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_station_daytime_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a coastal village police station during the day. The space is flooded with bright, natural daytime lighting that maintains a neutral color treatment and controlled contrast. This consistent illumination evenly covers the mundane workspace and the subject's features across different camera distances.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "해안마을 경찰 지구대 - 낮",
                  "밝은 지구대 안",
                  "Bright daytime station illumination keeps the relaxed setup plainly visible",
                  "Bright daytime interior illumination remains controlled across his frozen features"
                ],
                "visual_inferences": [
                  "The uniform bright lighting suggests standard office windows letting in ample daylight across the room"
                ],
                "creative_decisions": [
                  "Using restrained contrast and neutral tones to establish a peaceful, ordinary atmosphere that contrasts with the sudden shocking phone call"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 3,
                "shot_index": 15,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L03B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "d5843eb822cd3b65"
      },
      {
        "scene_index": 99,
        "heading": "101. 실내. 해안마을 경찰 지구대 - 낮",
        "beat_title": "마포서의 전화를 받고 당황하여 굳어버린 구창모",
        "representative_moment": "수화기를 귀에 대고 눈이 커진 채 허공을 응시하며 완전히 얼어붙은 구창모의 얼굴.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Eye-level close composition with controlled daytime illumination and increased facial contrast",
            "t2i_prompt": "Photorealistic cinematic still. A Korean middle-aged man in a police officer uniform, facing the camera, seated rigid at eye level. A black telephone receiver is pressed to his ear, its side profile visible against his cheek. His face and the receiver occupy most of the frame, his widened eyes positioned along the upper third, gazing off-screen in a frozen state of shock. Bright daytime interior illumination evenly covers the scene, casting subtle increased facial contrast across his features. A narrow, out-of-focus band of the daytime police station workspace remains visible behind him at the frame edges.",
            "outfit_assignments": [],
            "source_facts": [
              "해안마을 경찰 지구대 - 낮",
              "내선 전화를 눌러 전화를 받는 창모",
              "수화기를 귀에 댄 구창모가 놀란 눈으로 허공을 응시하며 완전히 얼어붙은 얼굴 클로즈업"
            ],
            "visual_inferences": [
              "fixed_element police_station_daytime_environment: bright daytime illumination and controlled contrast",
              "A Korean middle-aged man in a police officer uniform represents the police chief 구창모",
              "Close framing renders the background as a narrow out-of-focus band"
            ],
            "creative_decisions": [
              "Eyes positioned along the upper third to emphasize the off-screen gaze and reaction",
              "Increased facial contrast against the neutral daytime background to highlight the sudden psychological shift"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "desk",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "landline telephone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shelving",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smartphone",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b0853b3fedf5377d",
              "owned_hash": "2be92b3d8e0380c9",
              "camera_direction_hash": "0fd7a51955262b83",
              "owned_usage_hash": "ee9ee4ee03bfbf7c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 99,
        "dependency_reason": "동일 씬 이전 샷(Shot 1)의 밝고 통제된 지구대 낮 조명 환경(police_station_daytime_environment)을 유지하되, 클로즈업 프레이밍 규칙에 따라 배경을 아웃포커스된 좁은 영역으로 최소화하여 묘사함.",
        "_shot_index": 4,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 99,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The dolly-in has finished directly before 구창모 at eye level and now holds without drift, turning his immobility into the shot's dominant event. His face and the receiver occupy most of the close frame, with his widened eyes placed along the upper third and only a narrow trace of the station remaining behind him.",
            "lighting_mood": "Bright daytime interior illumination remains controlled across his frozen features, with increased facial contrast emphasizing the shock.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L03B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "police_station_daytime_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The interior of a coastal village police station during the day. The space is flooded with bright, natural daytime lighting that maintains a neutral color treatment and controlled contrast. This consistent illumination evenly covers the mundane workspace and the subject's features across different camera distances.",
                "applies_to_shots": [
                  1,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "해안마을 경찰 지구대 - 낮",
                  "밝은 지구대 안",
                  "Bright daytime station illumination keeps the relaxed setup plainly visible",
                  "Bright daytime interior illumination remains controlled across his frozen features"
                ],
                "visual_inferences": [
                  "The uniform bright lighting suggests standard office windows letting in ample daylight across the room"
                ],
                "creative_decisions": [
                  "Using restrained contrast and neutral tones to establish a peaceful, ordinary atmosphere that contrasts with the sudden shocking phone call"
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 99,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "02b74ce63d56c40a"
      },
      {
        "beat_title": "선착장에서의 허세",
        "dependency_reason": "S76 Shot 5에서 확립된 해안마을 선착장 배경을 그대로 유지하며, 도착한 일행의 새로운 정지 순간을 보여준다.",
        "dependent_scene_index": 76,
        "heading": "실외. 해안마을 선착장 - 낮",
        "representative_moment": "평상복 차림의 한국인 성인 남성이 턱을 치켜들고 한 손을 허리에 얹은 채, 짙은 화장의 한국인 성인 여성들 앞에 꼿꼿이 서 있다.",
        "scene_index": 100,
        "scene_type": "normal",
        "t2i_variations": [
          {
            "applied_frame_spatial_constraint_ids": [],
            "camera_effect": "Chest-height frontal observer composition with restrained contrast under natural daylight, emphasizing the man's elevated chin, planted hand, and spatial dominance over the uneven group.",
            "confidence": "high",
            "creative_decisions": [
              "Limit the visible group to the central man and two representative women for a clear three-person composition.",
              "Keep the referenced black van at the frame edge as a subdued arrival anchor.",
              "Use foreground-background spacing across the same dock to express the man's performative dominance."
            ],
            "outfit_assignments": [],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "buoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dock",
                "usage_kind": "anchor",
                "source_phrase": "the established open-air coastal village dock from the attached background reference"
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "guardrail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "van",
                "usage_kind": "anchor",
                "source_phrase": "the parked black van already present in that background reference"
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "source_facts": [
              "Shot description: 구창모 stands upright before the heavily made-up women with his chin raised and one hand on his waist.",
              "Scene text: the man wears casual clothes for the first time in the scene.",
              "Scene text: five or six women wear short skirts, heavy makeup, and flashy clothing.",
              "Scene heading: exterior coastal village dock during daytime.",
              "Shot staging: the man is seen at a three-quarter angle from the left, looking off-screen; the women are seen at three-quarter angles from the right, looking off-screen."
            ],
            "t2i_prompt": "Photorealistic cinematic still. At chest height directly before the group, a Korean adult man in casual clothes occupies the foreground at a three-quarter angle from the left, upright with his chin raised, one hand planted at his waist, a visibly swaggering expression, and his gaze directed off-screen. Two Korean adult women in short skirts and flashy clothes stand beyond and beside him in an uneven cluster on the same established open-air coastal village dock from the attached background reference; both have heavy makeup, three-quarter angles from the right, and gazes directed off-screen. The parked black van already present in that background reference remains readable at one frame edge, with part of its side and one end visible but subordinate to the group. Focus rests on the man's lifted chin and hand-at-waist posture, the uneven spacing between him and the women, and their shared off-screen attention. Natural daylight clearly separates all three figures; restrained contrast keeps the colorful clothing subdued rather than glossy.",
            "variant_label": "var_1",
            "visual_inferences": [
              "fixed_element coastal_village_dock: an open-air coastal dock under natural daylight, spatially connecting the vehicle drop-off area and boat mooring area.",
              "The group is reduced to three visible people to preserve staging clarity and T2I reproducibility.",
              "The man occupies the foreground and the women share the same dock behind and beside him, preserving the fixed spatial relationship."
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e03fd4a273c6a7ab",
              "owned_hash": "0ba9049cad196407",
              "camera_direction_hash": "c1c36a1e90679a9b",
              "owned_usage_hash": "66aa8a5954d88ffa",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "dock",
                  "violating_phrase": "the established open-air coastal village dock from the attached background reference",
                  "reason": "The prompt uses the dock as a spatial anchor referencing the existing background, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "van",
                  "violating_phrase": "The parked black van already present in that background reference",
                  "reason": "The prompt refers to the pre-existing van as a background element to remain readable, which matches the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 100,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height from directly before the group, a static medium-wide composition places 구창모 in the foreground with his chin lifted and one hand planted at his waist, while the women form an uneven cluster beyond and beside him. The parked black van remains readable at the frame edge as evidence of their arrival, without competing with the human grouping.",
            "lighting_mood": "Natural daylight clearly separates the clustered figures, with restrained contrast preventing their colorful clothing from becoming overly glossy.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "buoy",
              "dock",
              "fish crate",
              "fishing boat",
              "fishing net",
              "guardrail",
              "rope",
              "streetlight",
              "van",
              "warehouse"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "coastal_village_dock",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An open-air coastal village dock illuminated by natural daylight. The environment features a wide, paved waterfront platform adjacent to the sea water, serving as a continuous spatial connection between the vehicle drop-off zone and the boat mooring area.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 해안마을 선착장 - 낮",
                  "Natural daylight"
                ],
                "visual_inferences": [
                  "The dock surface is paved or concrete, typical for vehicle access and boat mooring.",
                  "The area bridges a parking zone and the water where fishing boats dock."
                ],
                "creative_decisions": [
                  "Restrained contrast and subdued saturation to maintain a grounded, realistic atmosphere across the exterior location."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 76,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L35B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "0597db84b194c422"
      },
      {
        "scene_index": 100,
        "heading": "102. 실외. 해안마을 선착장 - 낮",
        "beat_title": "낚시 어선 위에서 수신호를 보내는 황봉업",
        "representative_moment": "황봉업이 정박된 낚시 어선 위에서 한 팔을 머리 위로 번쩍 들어 올려 수신호를 보낸다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "shoulder-height long wide view",
            "t2i_prompt": "Photorealistic cinematic still. From an observer's point of view at shoulder height, a long wide view captures a Korean middle-aged man in fisher workwear standing full-length aboard the moored fishing boat, positioned in the outer third of the frame. He is seen at a three-quarter angle from the right, with one arm thrust straight overhead, looking off-screen. The wide, paved waterfront dock stretches out opposite the vessel, clearly establishing the spatial relationship of his long-distance gesture. Natural daylight illuminates the open-air environment with restrained contrast and subdued saturation.",
            "outfit_assignments": [],
            "source_facts": [
              "S100 action: 낚시 어선 앞에서 황 씨가 손을 흔든다.",
              "shot description: long wide view of Hwang shown full-length aboard the moored fishing boat, held near the outer third with one arm thrust above his head.",
              "environment: coastal village dock illuminated by natural daylight."
            ],
            "visual_inferences": [
              "The figure is at a three-quarter angle from the right, signaling toward the off-screen group.",
              "fixed_element coastal_village_dock: The dock surface is a wide, paved platform adjacent to the boat, providing a continuous spatial connection."
            ],
            "creative_decisions": [
              "Placing the figure in the outer third of the frame emphasizes the vastness of the dock and the distance of his signal.",
              "Restrained contrast and subdued saturation to maintain a grounded, realistic atmosphere across the exterior location."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "buoy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "dock",
                "usage_kind": "anchor",
                "source_phrase": "The wide, paved waterfront dock"
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "anchor",
                "source_phrase": "aboard the moored fishing boat"
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "guardrail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "van",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "warehouse",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f78a5604b1f9d0d1",
              "owned_hash": "0ba9049cad196407",
              "camera_direction_hash": "97b37a4a8ec0a349",
              "owned_usage_hash": "ebed1f955850fd2c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "dock",
                  "violating_phrase": "The wide, paved waterfront dock stretches out opposite the vessel",
                  "reason": "The dock is used purely as a spatial anchor reference opposite the vessel, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "fishing boat",
                  "violating_phrase": "aboard the moored fishing boat",
                  "reason": "The fishing boat is mentioned strictly as the physical base where the character is standing, matching the producer's declaration as an anchor.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on a prior scene (S100_Shot3 is a previous shot within the same scene).",
        "_shot_index": 5,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 100,
            "shot_index": 5
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The dockside pan resolves at shoulder height into a long wide view of 황봉업(황 씨) shown full-length aboard the moored fishing boat. He is held near the outer third with one arm thrust above his head, while the boat and dock relationship remains visible enough to establish whom he is signaling toward.",
            "lighting_mood": "Natural daylight preserves the long-distance gesture clearly, graded with restrained contrast and subdued saturation.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "buoy",
              "dock",
              "fish crate",
              "fishing boat",
              "fishing net",
              "guardrail",
              "rope",
              "streetlight",
              "van",
              "warehouse"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "coastal_village_dock",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An open-air coastal village dock illuminated by natural daylight. The environment features a wide, paved waterfront platform adjacent to the sea water, serving as a continuous spatial connection between the vehicle drop-off zone and the boat mooring area.",
                "applies_to_shots": [
                  3,
                  5
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 해안마을 선착장 - 낮",
                  "Natural daylight"
                ],
                "visual_inferences": [
                  "The dock surface is paved or concrete, typical for vehicle access and boat mooring.",
                  "The area bridges a parking zone and the water where fishing boats dock."
                ],
                "creative_decisions": [
                  "Restrained contrast and subdued saturation to maintain a grounded, realistic atmosphere across the exterior location."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 100,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L35B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "9213653631ee987d"
      },
      {
        "scene_index": 101,
        "heading": "103. 실외. 낚시 어선 - 낮",
        "beat_title": "만선된 어선 갑판의 인파와 도피를 논하는 대화",
        "representative_moment": "A dense crowd of festively dressed women and fishermen packs the deck of the fishing boat in bright daylight.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A static eye-level wide shot from the dock with a restrained color grade",
            "t2i_prompt": "Photorealistic cinematic still. A static eye-level wide shot from the dock looks across the full side of the fishing boat. The deck is completely packed with a dense crowd under bright natural daylight. Asian young women in festive clothing stand at three-quarter angle from the left, their shoulders tucked in the dense crowd, looking off-screen. Beside them, Asian middle-aged men in casual gear stand in right profile, leaning between nearby passengers, looking off-screen. The boat's cabin and metal railing enclose the dense rows of passengers overlapping across the midground. The concrete dock edge occupies the narrow lower frame. A restrained color grade mutes the bright clothing into deep earthy neutrals, maintaining a sober thriller tone.",
            "outfit_assignments": [],
            "source_facts": [
              "밝은 대낮의 낚시 어선 갑판 위로 화려한 옷차림의 술집 여자들과 후반부 낚싯꾼들이 발 디딜 틈 없이 빼곡하게 모여 서 있는 전경.",
              "The dock-facing side and the occupied top deck are visible across the frame."
            ],
            "visual_inferences": [
              "The concrete dock forms the immediate lower foreground anchor.",
              "Women at three-quarter angle and men in profile create a dense, irregular overlapping crowd pattern."
            ],
            "creative_decisions": [
              "Used an eye-level wide composition to capture the sheer density of the crowd against the boat's cabin.",
              "Applied a muted color grade to pull the vibrant festive clothing down into a heavy thriller palette."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bait bucket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bench",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "anchor",
                "source_phrase": "The boat's cabin and metal railing enclose the dense rows"
              },
              {
                "owned_token": "canopy",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cooler",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "deck",
                "usage_kind": "anchor",
                "source_phrase": "The deck is completely packed with a dense crowd"
              },
              {
                "owned_token": "drink can",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing line",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing reel",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing rod",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "folding stool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "landing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life jacket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "loudspeaker",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "anchor",
                "source_phrase": "The boat's cabin and metal railing enclose the dense rows"
              },
              {
                "owned_token": "rod holder",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rubber mat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tackle box",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f83ef3367397b2c7",
              "owned_hash": "a840e1171016cf80",
              "camera_direction_hash": "abde2afeeb0e9f98",
              "owned_usage_hash": "4c50e4302765073c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "deck",
                  "violating_phrase": "The deck is completely packed with a dense crowd",
                  "reason": "The deck is mentioned purely as a physical surface where the crowd is positioned, which matches the producer's declaration as an anchor.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "cabin",
                  "violating_phrase": "The boat's cabin and metal railing enclose the dense rows",
                  "reason": "The cabin is referred to as a spatial boundary enclosing the scene, matching the producer's anchor declaration with no redraw instructions.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "railing",
                  "violating_phrase": "The boat's cabin and metal railing enclose the dense rows",
                  "reason": "The railing is described as an enclosing element framing the passengers, which is a spatial reference and matches the anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "No direct visual dependency on a prior scene.",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 101,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A static eye-level wide shot from the dock looks across the full side of the fishing boat, keeping the crowded deck layout legible from end to end. The women and fishermen overlap in dense rows across foreground and midground, with small variations in posture and head direction preventing the crowd from reading as a formal lineup.",
            "lighting_mood": "Natural daylight renders the crowded deck clearly while a restrained grade keeps the festive clothing inside the thriller's sober tonal range.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L55B01",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bait bucket",
              "bench",
              "bollard",
              "cabin",
              "canopy",
              "cooler",
              "deck",
              "drink can",
              "fender",
              "fishing line",
              "fishing reel",
              "fishing rod",
              "folding stool",
              "landing net",
              "life jacket",
              "life ring",
              "loudspeaker",
              "navigation light",
              "railing",
              "rod holder",
              "rope",
              "rubber mat",
              "table",
              "tackle box"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "crowded_fishing_boat",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The deck of the fishing boat is completely packed with a dense crowd of male fishermen and female passengers wearing festive clothing under bright natural daylight.",
                "applies_to_shots": [
                  1,
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "술집 여자들과 낚싯꾼 무리까지 함께 올라타 배는 만원이다.",
                  "밝은 대낮의 낚시 어선 갑판 위로 화려한 옷차림의 술집 여자들과 후반부 낚싯꾼들이 발 디딜 틈 없이 빼곡하게 모여 서 있는 전경.",
                  "with the crowded boat held as contextual depth",
                  "the dock and boat collapse into soft contextual fragments at the edges"
                ],
                "visual_inferences": [
                  "The boat remains stationary at the dock throughout the conversation, with the crowd serving as a living background."
                ],
                "creative_decisions": [
                  "The brightly lit, densely packed boat deck is maintained as a continuous backdrop to ground the spatial relationship between the dock and the departing passengers."
                ],
                "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'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L55B01",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "866379f8960232aa"
      },
      {
        "scene_index": 101,
        "heading": "103. 실외. 낚시 어선 - 낮",
        "beat_title": "황 씨의 유혹에 동요하는 창모",
        "representative_moment": "On the pier, C15 listens intently as the older man leans in with a genial smile, the crowded fishing boat resting in the background.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height side angle medium two-shot under bright natural daylight",
            "t2i_prompt": "Photorealistic cinematic still. A medium two-shot from a chest-height side angle. An elderly Korean man in casual workwear occupies the nearer side in right profile, leaning slightly toward the listener, looking down with a deceptively genial smile. Just beyond him, sharing the same pier in the foreground, C15O18 in a police uniform, a Korean man in his late 40s with a gaunt face, short black hair, and tanned skin, stands in left profile, his weight held on his rear foot, looking up at the older man. The exact background environment from the prior shot is maintained: the deck of the fishing boat behind them is completely packed with a dense crowd of male fishermen and female passengers wearing festive clothing under bright natural daylight, held as contextual depth. The daylight keeps both profiles readable with measured contrast.",
            "outfit_assignments": [
              {
                "character_id": "C15",
                "outlook_id": "O18"
              }
            ],
            "source_facts": [
              "선착장에 서 있는 창모에게 다가온다.",
              "황 씨 (친절하게) 촌주 님께서 엄-청시리 큰 선물을 준비했다고 하셨는디...",
              "밝은 대낮의 낚시 어선 갑판 위로 화려한 옷차림의 술집 여자들과 후반부 낚싯꾼들이 발 디딜 틈 없이 빼곡하게 모여 서 있는 전경."
            ],
            "visual_inferences": [
              "Hwang looks down at Chang-mo with a genial smile in right profile",
              "Chang-mo looks up at Hwang in left profile, sharing the same pier space",
              "fixed_element crowded_fishing_boat: The deck of the fishing boat is completely packed with a dense crowd of male fishermen and female passengers wearing festive clothing under bright natural daylight."
            ],
            "creative_decisions": [
              "chest-height side angle to capture both profiles and their physical interaction",
              "bright natural daylight keeps both profiles readable while favoring the older man's deceptively genial expression",
              "the crowded boat is pushed to the background as contextual depth to keep focus on the two men on the pier"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character",
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "anchor",
                "source_phrase": "the deck of the fishing boat behind them is completely packed"
              },
              {
                "owned_token": "landing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lighthouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "sharing the same pier in the foreground"
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "winch",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "33022c9583471710",
              "owned_hash": "56ea5f7dd83af8ad",
              "camera_direction_hash": "9b3fcec0469ea6af",
              "owned_usage_hash": "ee3723c84c57a124",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "fishing boat",
                  "violating_phrase": "the deck of the fishing boat behind them is completely packed",
                  "reason": "The prompt references the fishing boat as a background spatial anchor to position the crowd, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pier",
                  "violating_phrase": "sharing the same pier in the foreground",
                  "reason": "The prompt uses the pier as a spatial reference to ground the characters' positions without instructing a redraw, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 101,
        "dependency_reason": "Exact background environment from the prior shot (S101_Shot1) must be preserved for spatial continuity.",
        "_shot_index": 6,
        "visible_entities": [
          "C15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 101,
            "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 the established chest-height side angle, 황봉업(황 씨) occupies the nearer side of a stable medium two-shot while 구창모 listens just beyond him. 황봉업(황 씨)'s genial smile and slight downward eyeline remain fully visible in profile, with the crowded boat held as contextual depth rather than a competing focal plane.",
            "lighting_mood": "Natural daylight keeps both profiles readable, with measured contrast favoring 황봉업(황 씨)'s deceptively genial expression.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "C15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C15",
                "outlook_id": "O18"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L55B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "breakwater",
              "cabin",
              "fender",
              "fish crate",
              "fishing boat",
              "landing net",
              "lighthouse",
              "mooring rope",
              "navigation light",
              "pier",
              "railing",
              "winch"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "crowded_fishing_boat",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The deck of the fishing boat is completely packed with a dense crowd of male fishermen and female passengers wearing festive clothing under bright natural daylight.",
                "applies_to_shots": [
                  1,
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "술집 여자들과 낚싯꾼 무리까지 함께 올라타 배는 만원이다.",
                  "밝은 대낮의 낚시 어선 갑판 위로 화려한 옷차림의 술집 여자들과 후반부 낚싯꾼들이 발 디딜 틈 없이 빼곡하게 모여 서 있는 전경.",
                  "with the crowded boat held as contextual depth",
                  "the dock and boat collapse into soft contextual fragments at the edges"
                ],
                "visual_inferences": [
                  "The boat remains stationary at the dock throughout the conversation, with the crowd serving as a living background."
                ],
                "creative_decisions": [
                  "The brightly lit, densely packed boat deck is maintained as a continuous backdrop to ground the spatial relationship between the dock and the departing passengers."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 101,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C15O18",
                "policy": "required"
              },
              {
                "kind": "background",
                "id": "L55B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "8135ecdfd5f98195"
      },
      {
        "scene_index": 101,
        "heading": "103. 실외. 낚시 어선 - 낮",
        "beat_title": "탐욕에 흔들리는 구창모",
        "representative_moment": "C15가 황 씨의 '큰 선물' 이야기에 솔깃해 두 눈을 번쩍 뜨며 화면 밖을 응시한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tight front three-quarter close-up at eye level, shallow depth of field",
            "t2i_prompt": "Photorealistic cinematic still. C15O18 in a dark police uniform, a Korean man in his late 40s with a lean face, short black hair, and tanned skin, occupies the middle-center foreground. Seen at a three-quarter angle from the right at eye level, his head juts forward slightly. His eyes are fixed off-screen and conspicuously widened with sudden curiosity and greed, sitting high in the frame composition. Firm natural daylight shapes strong facial contrast, catching a bright gleam in his widened eyes. [: The daytime dock and a densely packed fishing boat of male fishermen and female passengers collapse into soft, out-of-focus contextual fragments behind him], preserving a tight close-up where only his face and shoulders remain sharply visible.",
            "outfit_assignments": [
              {
                "character_id": "C15",
                "outlook_id": "O18"
              }
            ],
            "source_facts": [
              "창모 (급관심) 엄-청시리 큰 선물? 그기 뭔디요??",
              "The inward move ends at 구창모's eye level on a tight front three-quarter close-up",
              "The deck of the fishing boat is completely packed with a dense crowd of male fishermen and female passengers"
            ],
            "visual_inferences": [
              "C15's greed and curiosity are visually expressed through widened eyes and a forward-jutting head posture",
              "The busy background of the dock and boat is heavily blurred to isolate C15's sudden emotional shift"
            ],
            "creative_decisions": [
              "Positioned his eyes high in the frame composition to emphasize the intensity of the moment",
              "Used firm natural daylight to create stark facial contrast, highlighting the sudden brightness in his eyes"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "breakwater",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "landing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lighthouse",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "railing",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "winch",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c6cdd5a0b08013b2",
              "owned_hash": "56ea5f7dd83af8ad",
              "camera_direction_hash": "ac5548ab3b55d40f",
              "owned_usage_hash": "5a07cd3d8d0bca30",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 101,
        "dependency_reason": "Same continuous location (dock and boat) as previous shots, utilizing the crowd as a soft contextual background for the close-up.",
        "_shot_index": 9,
        "visible_entities": [
          "C15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 101,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The inward move ends at 구창모's eye level on a tight front three-quarter close-up, timed precisely as curiosity and greed widen his eyes. His face occupies most of the frame without becoming an extreme close-up; the eyes sit high in the composition while the dock and boat collapse into soft contextual fragments at the edges.",
            "lighting_mood": "Natural daylight is shaped into firmer facial contrast so the sudden brightness in his widened eyes carries the tonal shift.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "primary_subject_isolation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "구창모",
                  "screen_zone": "middle_center",
                  "target_id": "C15",
                  "target_kind": "character"
                }
              ]
            },
            "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": [
              "C15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C15",
                "outlook_id": "O18"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L55B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "crowded_fishing_boat",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The deck of the fishing boat is completely packed with a dense crowd of male fishermen and female passengers wearing festive clothing under bright natural daylight.",
                "applies_to_shots": [
                  1,
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "술집 여자들과 낚싯꾼 무리까지 함께 올라타 배는 만원이다.",
                  "밝은 대낮의 낚시 어선 갑판 위로 화려한 옷차림의 술집 여자들과 후반부 낚싯꾼들이 발 디딜 틈 없이 빼곡하게 모여 서 있는 전경.",
                  "with the crowded boat held as contextual depth",
                  "the dock and boat collapse into soft contextual fragments at the edges"
                ],
                "visual_inferences": [
                  "The boat remains stationary at the dock throughout the conversation, with the crowd serving as a living background."
                ],
                "creative_decisions": [
                  "The brightly lit, densely packed boat deck is maintained as a continuous backdrop to ground the spatial relationship between the dock and the departing passengers."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 101,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C15O18",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "b45cf024926a45bc"
      },
      {
        "scene_index": 102,
        "heading": "104. 실내. 동굴 - 낮",
        "beat_title": "가족으로서의 결의와 절망적인 발버둥",
        "representative_moment": "수리영이 온몸을 뒤로 젖히며 꿈쩍 않는 쇠사슬을 있는 힘껏 잡아당기고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "waist-height lateral track, medium-full profile, low-key high contrast",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from a waist-height lateral track, the upper body and thighs of an Asian young woman in worn casual clothes occupy the right side of the wide frame in left profile, her head and lower legs extending slightly beyond the upper and lower edges. She leans backward with her torso arched in a heavily strained posture, looking down. Both her hands firmly grip a thick, taut iron chain that stretches horizontally across the readable plane toward the left edge of the frame. Low-key daytime cave illumination creates strong, high-contrast shadows along her tense posture and the metal chain, set against the dim, rough stone walls of the cave interior.",
            "outfit_assignments": [],
            "source_facts": [
              "S104 action: 수리영 pulls the chain with all her might, but it doesn't budge.",
              "shot description: 김지후(강수리영) gripping the heavy chain with both hands, leaning back in a tense posture."
            ],
            "visual_inferences": [
              "waist-height camera framing emphasizes the lateral horizontal pull of the chain without showing the full silhouette, complying with geometric framing rules",
              "high-contrast lighting accentuates the physical strain and gritty texture of the metal chain and cave walls"
            ],
            "creative_decisions": [
              "placing the character on the right side pulling toward the left edge maximizes the visual tension of the taut chain within a single readable plane",
              "cool, earthy tones for the cave interior to maintain the somber thriller mood"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "71d372de72af8f98",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "f2680f100a5d45db",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "독립된 카메라 설정과 새로운 액션 순간",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 102,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The lateral track from 정인우's side settles at waist height into a medium-full profile of 김지후(강수리영), preserving her backward lean and the chain's taut line within one readable plane. Her braced body occupies one side of the frame while both hands and a visible length of chain pull toward the opposite edge, making resistance physically clear without enlarging the prop unnaturally.",
            "lighting_mood": "Low-key daytime cave illumination retains strong contrast along her strained posture and the taut chain without specifying an unseen source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 54,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "f50a693841805767"
      },
      {
        "scene_index": 102,
        "heading": "105. 몽타주: 4. 낚시 어선(저녁)",
        "beat_title": "어창에 감금된 제물들 발각",
        "representative_moment": "열린 어창 바닥에 손발이 묶이고 입이 틀어막힌 다수의 여성 제물들이 공포에 질려 웅크린 채 위를 올려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "steep overhead high angle, tight wide composition, low evening illumination with high contrast",
            "t2i_prompt": "Photorealistic cinematic still. From a steep high angle looking directly down into the vessel, the open boat hold rim forms a rectangular wooden enclosure in the middle-center foreground. Down inside the dark compartment in the lower-center midground, a group of clustered captive Asian women are tightly packed together, curled in overlapping poses. Their wrists and ankles are firmly bound with thick ropes, and their mouths are tightly gagged with rough cloth. The women are looking up toward the opening with wide, terrified eyes, their backs against the wooden floorboards. The raised compartment lids sit just beside the opening. Low evening illumination falls straight into the hold with high contrast, catching the texture of the restraints and their fearful expressions, while deep shadows swallow the surrounding edges of the hull.",
            "outfit_assignments": [],
            "source_facts": [
              "Montage text: 안에는 손발이 묶이고 입까지 틀어막힌 또다른 여자들이 십수 명 숨겨져 있다.",
              "Shot description: From above the opened boat hold, a steep high angle advances into a tight wide composition",
              "Subject state: looking_away, curled together, limbs bound, gaze=up, state=alive"
            ],
            "visual_inferences": [
              "the raised lids rest around the hold opening",
              "wooden texture of the boat interior",
              "Asian women based on regional context"
            ],
            "creative_decisions": [
              "placed the clustered women in the lower-center midground and the hold rim in the middle-center foreground to perfectly align with the frame spatial contract",
              "used high contrast directional lighting dropping straight down to emphasize isolation and fear"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001",
              "fsc_002"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "53d09b630d740c05",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "861af7893afbc77e",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "montage",
        "dependent_scene_index": 54,
        "dependency_reason": "previous_shot_refs indicates a location reference to S54_Shot4",
        "_shot_index": 12,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 102,
            "shot_index": 12
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From above the opened boat hold, a steep high angle advances into a tight wide composition that keeps several captive bodies, their bound limbs, and covered mouths simultaneously legible. The women cluster across the lower and middle frame in overlapping curled poses, while the rectangular hold opening remains visible around them as the scale reference and enclosure.",
            "lighting_mood": "Low evening illumination appropriate to the boat setting falls into the open hold with high contrast, preserving enough detail to read the captives' fear and restraints.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "clustered captive women",
                  "screen_zone": "lower_center",
                  "target_id": "",
                  "target_kind": "background"
                },
                {
                  "constraint_id": "fsc_002",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "open boat hold rim",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 54,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "f85738d90ce75abe"
      },
      {
        "scene_index": 102,
        "heading": "104. 실내. 동굴 - 낮 / 105. 몽타주",
        "beat_title": "만월제의 본격적인 시작과 영란의 등장",
        "representative_moment": "순백의 무녀복을 입은 영란이 제단 앞 붉은 모닥불 빛을 받으며 위엄 있게 서 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height low-angle framing, central-axis dolly stop, low-key high-contrast red bonfire lighting",
            "t2i_prompt": "Photorealistic cinematic still. Seen from a waist-height low angle, an elderly Korean woman with white hair in a pure white ritual robe stands in the middle third of the frame, fully visible from head to toe. She is facing the camera with her feet firmly planted on the ritual ground in the lower frame, her spine rigid, gazing directly at the camera. In the lower foreground, a strongly burning red bonfire occupies the bottom edge. Layered behind her in the shared ritual clearing, a stone altar is set before a large rock on the same central axis. A circle of residents in black traditional robes is gathered around the altar in prayer. Intense red bonfire light strikes the woman's white ritual robe in a low-key, high-contrast composition, leaving the surrounding background figures and the dark forest night submerged in subdued shadows.",
            "outfit_assignments": [],
            "source_facts": [
              "7. 숲속 만월제 도당(저녁): 바위 앞에 재등장 하는 영란 - 이번엔 순결한 흰색 무녀복으로 갈아입었다.",
              "바위 앞 제단 주변 모닥불이 다시 활활 타오르고…",
              "검은옷 주민들은 바위 주변에 둥그렇게 원을 만들어 서서 기도를 올린다."
            ],
            "visual_inferences": [
              "Unregistered character '강영란(흰 머리 여자)' is rendered as an elderly Korean woman with white hair, based on region rules.",
              "Waist-height low angle places her feet in the lower frame and perfectly captures her full-body rigid posture."
            ],
            "creative_decisions": [
              "Kept the foreground bonfire strictly at the bottom edge to adhere to the occupancy limit without obscuring the primary subject.",
              "Used deep shadows for the surrounding black-clad worshippers to maximize the high-contrast impact of the red light hitting the pure white robe."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "209f0afc740986c2",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "e6f14d548564aeb4",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "montage",
        "dependent_scene_index": 102,
        "dependency_reason": "Shot 12 in the same scene established the exact background location and mood of the ritual altar in the forest, which needs to carry over into this moment.",
        "_shot_index": 17,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 102,
            "shot_index": 17
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From waist height four meters in front of the altar, the camera completes its central-axis dolly and stops with 강영란(흰 머리 여자) framed head to toe in the middle third. A slight low-angle tilt preserves her rigid ceremonial authority, while the altar and worshippers remain layered behind her and the fire stays below the foreground-object occupancy limit.",
            "lighting_mood": "Red bonfire light strikes the white ritual robe in a low-key, high-contrast composition while the surrounding figures remain comparatively subdued.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 102,
                "shot_index": 12,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "4f57eac48ea4eb43"
      },
      {
        "scene_index": 103,
        "heading": "실외. 갯바위 - 저녁",
        "beat_title": "갯바위로 기어 올라와 거친 숨을 몰아쉬는 산들",
        "representative_moment": "바닷물에 흠뻑 젖은 고산들이 갯바위 위에 대자로 벌러덩 드러누워 거친 숨을 몰아쉰다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "overhead high angle wide framing, low-key natural ambient evening light",
            "t2i_prompt": "Photorealistic cinematic still. Overhead high angle from slightly beyond the feet, the camera looking down along the body axis. A Korean man in drenched dark heavy clothing lies flat on his back on a rough rock surface, completely soaked with seawater. He is positioned in a supine, spread-eagle posture at three-quarter angle from the right, his chest heaving, looking up at the sky. His wet hair and clothes cling tightly to his body. He occupies the central vertical corridor of the frame. The dark, wet surface of the rock reflects the fading evening light under low-key natural ambient illumination. The wave-struck edge of the rock and the dark sea moving in waves are visible beyond his feet, establishing the dim, damp, and harsh atmosphere.",
            "outfit_assignments": [],
            "source_facts": [
              "바닷물에 흠뻑 젖은 고산들이 갯바위 위에 대자로 벌러덩 드러누워 있는 전신.",
              "겨우 갯바위 위로 올라와 벌러덩 자빠져 눕는다. 거칠게 숨을 몰아쉬다가…",
              "lying spread-eagle, chest heaving, gaze=up",
              "facing the camera"
            ],
            "visual_inferences": [
              "fixed_element sandeul_soaked_supine: completely soaked, supine, spread-eagle posture, clothes and hair clinging tightly",
              "fixed_element evening_wet_rocky_shore: rugged rocky shore, dark and wet surface, low-key natural ambient light",
              "camera position beyond the feet looking up the body axis creates a forced perspective emphasizing his entire spread-eagle figure"
            ],
            "creative_decisions": [
              "framed with wide framing from high above to capture the full body occupying the central vertical corridor",
              "used dim, damp, and harsh evening lighting to highlight the reflective wetness of his skin and the surrounding rock"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "barnacle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "driftwood",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "anchor",
                "source_phrase": "a rough rock surface"
              },
              {
                "owned_token": "sea",
                "usage_kind": "anchor",
                "source_phrase": "the dark sea moving in waves"
              },
              {
                "owned_token": "seaweed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tide pool",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "1a5552cb1d29106e",
              "owned_hash": "4ae446d380e1eeac",
              "camera_direction_hash": "f96eb1ed687d7fe9",
              "owned_usage_hash": "18a422ce5a6ffc45",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "rock",
                  "violating_phrase": "a rough rock surface",
                  "reason": "The prompt references the rock surface and its edge to position the character and describe ambient lighting, acting as a spatial anchor matching the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "sea",
                  "violating_phrase": "the dark sea moving in waves",
                  "reason": "The prompt mentions the sea in the background to establish the atmosphere and composition, acting as an anchor matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 20,
        "dependency_reason": "exact_background ref_usage from S20_Shot8 ensures consistent rocky shore environment",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 103,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From high above and slightly beyond 고산들's feet, the camera begins its diagonal advance along his body axis, holding his entire spread-eagle figure against the 갯바위. His body occupies the central vertical corridor, with the wave-struck edge beyond his feet providing scale and danger without obscuring him.",
            "lighting_mood": "Low-key natural ambient light appropriate to the approaching darkness of evening preserves the soaked figure against the rock.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L15B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "barnacle",
              "driftwood",
              "rock",
              "sea",
              "seaweed",
              "tide pool"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sandeul_soaked_supine",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "The Korean man is completely soaked with seawater, lying flat on his back on a rough rocky surface. His drenched clothes and hair cling tightly to his body. He maintains a supine, spread-eagle posture with his gaze directed upward.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "바닷물에 흠뻑 젖은 고산들이 갯바위 위에 대자로 벌러덩 드러누워 있는 전신.",
                  "갯바위에 누운 고산들이",
                  "lying spread-eagle, gaze=up",
                  "supine, neck arched screaming, gaze=up"
                ],
                "visual_inferences": [
                  "His clothes and hair are thoroughly drenched and heavy with water.",
                  "His skin has a wet, reflective sheen from the seawater."
                ],
                "creative_decisions": [
                  "The clothing is dark and heavy, emphasizing the physical exhaustion and dampness."
                ],
                "confidence": "high"
              },
              {
                "element_id": "evening_wet_rocky_shore",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A rugged, uneven rocky shore beside the sea, featuring a dark and wet surface reflecting the fading light. The environment is illuminated by low-key natural ambient light of the early evening, creating a dim, damp, and harsh atmosphere.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "이제 곧 짙은 어둠이 내려앉을 세상.",
                  "Low-key natural ambient light appropriate to the approaching darkness of evening preserves the soaked figure against the rock.",
                  "Fading evening ambience is treated with stark contrast"
                ],
                "visual_inferences": [
                  "The rocks have a glossy, wet texture due to the crashing waves.",
                  "The overall lighting is fading, casting deep shadows characteristic of approaching nightfall."
                ],
                "creative_decisions": [
                  "The color palette is dominated by dark, cool tones to reflect the desolate and dangerous nature of the sea rocks."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 20,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L15B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "d699383b46b08a1f"
      },
      {
        "scene_index": 103,
        "heading": "106. 실외. 갯바위 - 저녁",
        "beat_title": "분노와 오열의 괴성",
        "representative_moment": "바닷물에 흠뻑 젖은 남자가 갯바위에 누워 허공을 향해 분노에 찬 괴성을 내지른다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Centered high-angle framing on the upper body with stark contrast fading evening light",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from above, centered on the upper torso and angling down, a Korean man in his 30s in a drenched dark heavy shirt lies supine on a rough surface. His upturned face, taut neck, and upper chest occupy most of the frame. He is at three-quarter angle from the left, looking up, his neck arched and mouth wide open in a scream. His skin and hair have a wet, reflective sheen from the seawater. A narrow strip of dark, wet rocky surface and moving sea remains visible around the edges of the frame. The scene is lit by low-key fading evening ambient light with stark contrast, casting deep shadows that emphasize his strained facial muscles.",
            "outfit_assignments": [],
            "source_facts": [
              "겨우 갯바위 위로 올라와 벌러덩 자빠져 눕는다.",
              "분노에 괴성을 지르는 산들.",
              "이제 곧 짙은 어둠이 내려앉을 세상. 갯바위에 철벅거리는 파도"
            ],
            "visual_inferences": [
              "fixed_element sandeul_soaked_supine: drenched dark heavy clothes clinging to the body, wet reflective sheen on skin",
              "fixed_element evening_wet_rocky_shore: fading evening light, dim and harsh atmosphere",
              "Sub-region framing isolates the upper chest and face, rendering the background rock and sea only as a narrow border at the frame edges."
            ],
            "creative_decisions": [
              "Employed a steep downward angle centered on the chest to emphasize vulnerability and the physical strain of the scream.",
              "Applied stark contrast lighting to make the wet skin textures and popping veins highly legible against the dim, fading environment."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "barnacle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "driftwood",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "sea",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "seaweed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tide pool",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "36dd5829f2bc69b2",
              "owned_hash": "4ae446d380e1eeac",
              "camera_direction_hash": "1f4665f24419bf54",
              "owned_usage_hash": "33d1c24a14612630",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 103,
        "dependency_reason": "직전 샷(Shot 2)에서 확립된 젖은 인물 상태와 갯바위의 조명 환경을 유지하되, 인물의 상반신과 표정으로 카메라 앵글과 프레이밍 스케일을 좁힘",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 103,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Centered above 고산들's upper torso, the continuing dolly briefly arrests at the peak of his scream, angling down his chest line toward the upturned face. His open mouth, taut neck, and upper chest occupy most of the frame, while a narrow strip of rock and sea remains at the edges as spatial evidence.",
            "lighting_mood": "Fading evening ambience is treated with stark contrast so the strained face and wet skin remain legible without introducing an unsupported light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L15B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sandeul_soaked_supine",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "The Korean man is completely soaked with seawater, lying flat on his back on a rough rocky surface. His drenched clothes and hair cling tightly to his body. He maintains a supine, spread-eagle posture with his gaze directed upward.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "바닷물에 흠뻑 젖은 고산들이 갯바위 위에 대자로 벌러덩 드러누워 있는 전신.",
                  "갯바위에 누운 고산들이",
                  "lying spread-eagle, gaze=up",
                  "supine, neck arched screaming, gaze=up"
                ],
                "visual_inferences": [
                  "His clothes and hair are thoroughly drenched and heavy with water.",
                  "His skin has a wet, reflective sheen from the seawater."
                ],
                "creative_decisions": [
                  "The clothing is dark and heavy, emphasizing the physical exhaustion and dampness."
                ],
                "confidence": "high"
              },
              {
                "element_id": "evening_wet_rocky_shore",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A rugged, uneven rocky shore beside the sea, featuring a dark and wet surface reflecting the fading light. The environment is illuminated by low-key natural ambient light of the early evening, creating a dim, damp, and harsh atmosphere.",
                "applies_to_shots": [
                  2,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "이제 곧 짙은 어둠이 내려앉을 세상.",
                  "Low-key natural ambient light appropriate to the approaching darkness of evening preserves the soaked figure against the rock.",
                  "Fading evening ambience is treated with stark contrast"
                ],
                "visual_inferences": [
                  "The rocks have a glossy, wet texture due to the crashing waves.",
                  "The overall lighting is fading, casting deep shadows characteristic of approaching nightfall."
                ],
                "creative_decisions": [
                  "The color palette is dominated by dark, cool tones to reflect the desolate and dangerous nature of the sea rocks."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 103,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "dfb4f7f0d13518bd"
      },
      {
        "scene_index": 104,
        "heading": "실외. 반월 식당 앞 - 밤",
        "beat_title": "죽은 자의 귀환을 목격한 공포",
        "representative_moment": "짐꾸러미를 든 채 문턱을 넘다 굳어버린 아시안 중년 남성의 경악한 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level close-up, low-key ambient illumination",
            "t2i_prompt": "Photorealistic cinematic still. An Asian middle-aged man dominates the central two-thirds of the frame at eye level, caught mid-step halfway across a raised threshold. His head is turned at a three-quarter angle from the right, his face paralyzed in extreme terror with widened eyes gazing off-screen. Two fabric bundles, gripped one in each hand, enter only at the lower corners of the frame. An open wooden doorway brackets his shoulders on both sides, marking the interrupted exit. Low-key ambient night illumination isolates his panicked expression while casting deep shadows along the periphery.",
            "outfit_assignments": [],
            "source_facts": [
              "S104 action: '황 씨가 무언가를 보고 허걱- 멈춰선다.'",
              "shot description: 식당 문턱을 넘는 자세로 양손에 짐꾸러미를 든 채, 경악하여 두 눈이 휘둥그레진 황봉업(황 씨)의 얼굴 클로즈업."
            ],
            "visual_inferences": [
              "fixed_element restaurant_exterior_and_road: The open doorway and threshold serves as a physical boundary.",
              "DP directive: camera at eye level, compressing his face and shoulders into roughly the central two-thirds.",
              "Bundles appear partially at the lower corners to signify his interrupted departure."
            ],
            "creative_decisions": [
              "Used a close framing scale to isolate the subject's wide-eyed terror, skipping the deep background entirely.",
              "Bracketed the subject with the open doorway at the frame edges to emphasize the boundary between safety and the dark exterior.",
              "Applied low-key lighting to highlight his panicked eyes against the surrounding shadows."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "exterior light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flashlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "plastic crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "road",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shoe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "signboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "51c553b4b6f82c05",
              "owned_hash": "ece0b6c29b108263",
              "camera_direction_hash": "6cce18250c3b7ad5",
              "owned_usage_hash": "6b859b08ab38a112",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 100,
        "dependency_reason": "식당 앞 실외 배경의 공간(location) 일관성 유지",
        "_shot_index": 1,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 104,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The static camera waits outside the doorway at 황봉업(황 씨)'s eye level, compressing his face and shoulders into roughly the central two-thirds as he freezes halfway across the threshold. His head turns into a three-quarter angle toward the unseen road, while the two bundles enter only at the lower corners and the open doorway brackets the shock.",
            "lighting_mood": "Low-key ambient illumination appropriate to the night exterior isolates his widened eyes without specifying an unsupported source or color.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L35B05",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "restaurant_exterior_and_road",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The open doorway and threshold of a modest rural restaurant connecting directly to a dark, sloping village road. The threshold serves as a physical boundary between the interior and the exterior, while the uneven, slightly inclined road leads downward into the dark night. Low-key ambient lighting covers the area, casting deep shadows along the periphery.",
                "applies_to_shots": [
                  1,
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "반월 식당 앞 - 밤",
                  "식당 문턱을 넘는 자세",
                  "식당으로 향하는 마을길을 저벅저벅 올라오는",
                  "The static camera waits outside the doorway",
                  "sloping road... road receding behind him",
                  "sprinting through doorway",
                  "leaving the road periphery subdued"
                ],
                "visual_inferences": [
                  "The doorway is slightly elevated from the sloping road, necessitating a visible threshold step.",
                  "The road is unpaved or roughly paved, typical of an isolated rural village."
                ],
                "creative_decisions": [
                  "Used the doorway as a consistent framing anchor that separates the immediate safety of the building from the dangerous, dark slope of the road outside."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 100,
                "shot_index": 5,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "6c0c55558179351a"
      },
      {
        "scene_index": 104,
        "heading": "107. 실외. 반월 식당 앞 - 밤",
        "beat_title": "reaction",
        "representative_moment": "A fierce young man frozen mid-stride as he aggressively advances uphill along a dark village road.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Waist-height wide framing with high-contrast night ambience",
            "t2i_prompt": "Photorealistic cinematic still. Framed from just outside the existing restaurant doorway, from a waist-height viewpoint, a fierce young Asian man with an athletic build in dark practical clothing is captured full length on the dark, sloping village road. He is seen at three-quarter angle from the left, mid-stride advancing uphill with his lead knee raised, his gaze looking off-screen. Restrained night ambience and high-contrast lighting cast deep shadows along the periphery, highlighting his predatory silhouette against the uneven road receding behind him.",
            "outfit_assignments": [],
            "source_facts": [
              "살기 어린 눈빛을 한 고산들",
              "mid-stride 자세로 성큼성큼 걸어 올라오는 중인 위압적인 전신",
              "From waist height just outside the doorway, the retreating camera aims down the sloping road",
              "holds 고산들 full length in the central corridor as he advances uphill"
            ],
            "visual_inferences": [
              "fixed_element sandeul_appearance: dark practical clothing, athletic build",
              "fixed_element restaurant_exterior_and_road: uneven sloping road, deep shadows along the periphery"
            ],
            "creative_decisions": [
              "Placed the restaurant doorway in the middle-center foreground to anchor the viewpoint per the spatial contract.",
              "Used high-contrast lighting to maintain readability of his sharp, predatory silhouette against the dark environment."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "Framed from just outside the existing restaurant doorway"
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "exterior light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flashlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "plastic crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "road",
                "usage_kind": "anchor",
                "source_phrase": "on the dark, sloping village road"
              },
              {
                "owned_token": "shoe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "signboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e9d48bdf19c90c15",
              "owned_hash": "ece0b6c29b108263",
              "camera_direction_hash": "b020286a86716efc",
              "owned_usage_hash": "fc73463db63c3965",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "Framed from just outside the existing restaurant doorway",
                  "reason": "The doorway is used strictly as a spatial camera framing anchor with no redraw instruction, which aligns with the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "road",
                  "violating_phrase": "on the dark, sloping village road",
                  "reason": "The road is mentioned as the environmental surface the character moves on, which functions as an anchor reference.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": -1,
        "dependency_reason": "",
        "_shot_index": 3,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 104,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From waist height just outside the doorway, the retreating camera aims down the sloping road and holds 고산들 full length in the central corridor as he advances uphill. The shallow downward angle preserves the doorway-side viewpoint, with his raised lead leg caught between steps and the road receding behind him.",
            "lighting_mood": "Restrained night ambience and high contrast keep 고산들's full silhouette and murderous expression readable against the darker road.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "foreground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "restaurant doorway",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B05",
            "reference_usage": "exact_background",
            "owned_objects": [
              "awning",
              "bicycle",
              "cable",
              "chair",
              "counter",
              "door",
              "drain",
              "exterior light",
              "fishing net",
              "flashlight",
              "plastic crate",
              "road",
              "shoe",
              "signboard",
              "stone wall",
              "stool",
              "streetlight",
              "table",
              "utility pole",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sandeul_appearance",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "A fierce young man with an athletic build, maintaining the same dark, practical clothing suitable for a physical confrontation in the night environment. His overall styling and attire remain strictly consistent as he transitions from aggressively striding uphill to leaping forward like a predator.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "살기 어린 눈빛을 한 고산들",
                  "mid-stride 자세로 성큼성큼 걸어 올라오는 중인 위압적인 전신",
                  "맹수처럼 허공으로 맹렬하게 몸을 날린 순간",
                  "고산들 full length in the central corridor",
                  "airborne in predatory leap"
                ],
                "visual_inferences": [
                  "Wears unrestrictive, dark casual or athletic wear fitting for a night ambush and extreme physical movements like a high leap."
                ],
                "creative_decisions": [
                  "Kept his silhouette sharp and distinct against the dark background to emphasize his predatory presence without relying on brightly colored garments."
                ],
                "confidence": "high"
              },
              {
                "element_id": "restaurant_exterior_and_road",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The open doorway and threshold of a modest rural restaurant connecting directly to a dark, sloping village road. The threshold serves as a physical boundary between the interior and the exterior, while the uneven, slightly inclined road leads downward into the dark night. Low-key ambient lighting covers the area, casting deep shadows along the periphery.",
                "applies_to_shots": [
                  1,
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "반월 식당 앞 - 밤",
                  "식당 문턱을 넘는 자세",
                  "식당으로 향하는 마을길을 저벅저벅 올라오는",
                  "The static camera waits outside the doorway",
                  "sloping road... road receding behind him",
                  "sprinting through doorway",
                  "leaving the road periphery subdued"
                ],
                "visual_inferences": [
                  "The doorway is slightly elevated from the sloping road, necessitating a visible threshold step.",
                  "The road is unpaved or roughly paved, typical of an isolated rural village."
                ],
                "creative_decisions": [
                  "Used the doorway as a consistent framing anchor that separates the immediate safety of the building from the dangerous, dark slope of the road outside."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 52,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L35B05",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "a80e8cdcc740c06b"
      },
      {
        "scene_index": 104,
        "heading": "실외. 반월 식당 앞 - 밤",
        "beat_title": "분노의 도약과 쫓기는 자들",
        "representative_moment": "고산들이 도망치는 황 씨와 창모를 향해 맹렬하게 허공으로 몸을 날려 추격한다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "A waist-height tracking view from behind with low-key night illumination and hard separation",
            "t2i_prompt": "Photorealistic cinematic still. A waist-height tracking view from behind and slightly left. A young Korean man with an athletic build in dark practical clothing is fully airborne in a predatory leap, his body cutting diagonally from the lower-left foreground over the uneven road, his back to the camera, unseen eyes fixed on the man ahead. Farther ahead along the same road, a middle-aged Korean man sprints through the open door, his hunched back exposed to the camera, looking off-screen. Beside him, a second middle-aged Korean man is caught mid-stride at a three-quarter angle from the right, shoulders pitched forward in flight, looking off-screen. The figures share the spatial depth of the road leading to the threshold. Low-key night illumination renders the airborne outline and the fleeing backs in hard separation against the dark background, while leaving the road periphery subdued in deep shadow.",
            "outfit_assignments": [],
            "source_facts": [
              "고산들이 도망치는 황봉업과 구창모의 등 뒤를 향해 맹수처럼 허공으로 맹렬하게 몸을 날린 순간",
              "황봉업이 후다닥 뒤돌아 식당 안으로 뛴다",
              "구창모도 반사적으로 황 씨를 따라간다"
            ],
            "visual_inferences": [
              "sandeul_appearance: A fierce young man with an athletic build in dark practical clothing",
              "restaurant_exterior_and_road: The threshold serves as a physical boundary, with the uneven road leading downward",
              "Waist-height tracking emphasizes the height and forward momentum of the leap"
            ],
            "creative_decisions": [
              "Placed the leaping young man in the lower-left foreground to establish a strong diagonal vector toward the fleeing men",
              "Used low-key illumination to cast deep shadows on the road periphery while highlighting the outlines of the figures"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "awning",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bicycle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "chair",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "counter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "door",
                "usage_kind": "anchor",
                "source_phrase": "sprints through the open door"
              },
              {
                "owned_token": "drain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "exterior light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing net",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flashlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "plastic crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "road",
                "usage_kind": "anchor",
                "source_phrase": "over the uneven road"
              },
              {
                "owned_token": "shoe",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "signboard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stool",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "streetlight",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "window",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "48bbbd6473fbe608",
              "owned_hash": "ece0b6c29b108263",
              "camera_direction_hash": "6d250586a9b8f96c",
              "owned_usage_hash": "7d1c7f4b792e3ead",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "door",
                  "violating_phrase": "sprints through the open door",
                  "reason": "The door serves as a spatial reference for the character's movement, which is a consistent anchor usage matching the producer's echo.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "road",
                  "violating_phrase": "over the uneven road",
                  "reason": "The road is referenced as the grounding terrain to establish the physical layout of the chase, acting as an anchor as declared.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 104,
        "dependency_reason": "Same background space and lighting as the previous shot (Shot 3) outside the restaurant.",
        "_shot_index": 7,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 104,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "A waist-height tracking view from behind and slightly left of 고산들 catches him fully airborne, his body cutting diagonally from the lower-left foreground toward the doorway. 황봉업(황 씨) and 구창모 occupy separate lanes farther ahead with their backs exposed, preserving a clear predator-to-prey depth progression without allowing any one prop to overwhelm the frame.",
            "lighting_mood": "Low-key night illumination renders the airborne outline and fleeing backs in hard separation while leaving the road periphery subdued.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L35B05",
            "reference_usage": "exact_background",
            "owned_objects": [
              "awning",
              "bicycle",
              "cable",
              "chair",
              "counter",
              "door",
              "drain",
              "exterior light",
              "fishing net",
              "flashlight",
              "plastic crate",
              "road",
              "shoe",
              "signboard",
              "stone wall",
              "stool",
              "streetlight",
              "table",
              "utility pole",
              "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "sandeul_appearance",
                "element_type": "character_state",
                "character_name": "고산들",
                "description": "A fierce young man with an athletic build, maintaining the same dark, practical clothing suitable for a physical confrontation in the night environment. His overall styling and attire remain strictly consistent as he transitions from aggressively striding uphill to leaping forward like a predator.",
                "applies_to_shots": [
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "살기 어린 눈빛을 한 고산들",
                  "mid-stride 자세로 성큼성큼 걸어 올라오는 중인 위압적인 전신",
                  "맹수처럼 허공으로 맹렬하게 몸을 날린 순간",
                  "고산들 full length in the central corridor",
                  "airborne in predatory leap"
                ],
                "visual_inferences": [
                  "Wears unrestrictive, dark casual or athletic wear fitting for a night ambush and extreme physical movements like a high leap."
                ],
                "creative_decisions": [
                  "Kept his silhouette sharp and distinct against the dark background to emphasize his predatory presence without relying on brightly colored garments."
                ],
                "confidence": "high"
              },
              {
                "element_id": "restaurant_exterior_and_road",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The open doorway and threshold of a modest rural restaurant connecting directly to a dark, sloping village road. The threshold serves as a physical boundary between the interior and the exterior, while the uneven, slightly inclined road leads downward into the dark night. Low-key ambient lighting covers the area, casting deep shadows along the periphery.",
                "applies_to_shots": [
                  1,
                  3,
                  7
                ],
                "element_scope": "full",
                "source_facts": [
                  "반월 식당 앞 - 밤",
                  "식당 문턱을 넘는 자세",
                  "식당으로 향하는 마을길을 저벅저벅 올라오는",
                  "The static camera waits outside the doorway",
                  "sloping road... road receding behind him",
                  "sprinting through doorway",
                  "leaving the road periphery subdued"
                ],
                "visual_inferences": [
                  "The doorway is slightly elevated from the sloping road, necessitating a visible threshold step.",
                  "The road is unpaved or roughly paved, typical of an isolated rural village."
                ],
                "creative_decisions": [
                  "Used the doorway as a consistent framing anchor that separates the immediate safety of the building from the dangerous, dark slope of the road outside."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 104,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L35B05",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "b411d32080f91eb8"
      },
      {
        "scene_index": 105,
        "heading": "108. 실외. 숲속 만월제 도당 - 밤",
        "beat_title": "보름달 아래 시작되는 광기 어린 만월제",
        "representative_moment": "둥근 보름달이 빛나는 숲속 제단 한가운데, 거대한 모닥불 주위로 검은 옷을 입은 신도들이 둥글게 모여 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "wide composition at eye level, low-key and high-contrast lighting with warm fire and cool moonlight",
            "t2i_prompt": "Photorealistic cinematic still. Wide composition at eye level from the outer edge of [L36: a dark forest clearing at night]. A massive, fiercely burning bonfire occupies the lower-central frame, its bright flames rising high. A wide, continuous ring of unnamed worshippers in black clothing surrounds the fire, standing stationary. The high-contrast warm firelight brightly illuminates the inner edges of their dark garments against the deep night. Beyond the circle of worshippers, a rustic stone altar consisting of a large rock sits in the background, facing the central ritual space. A bright full moon shines in the upper frame sky, casting a low-key, cool ambient glow over the restrained dark-toned ritual tableau.",
            "outfit_assignments": [],
            "source_facts": [
              "활활 드높이 타오르는 모닥불",
              "불 주변으로 둥그런 원을 그린 수십 명의 검은옷 신도들",
              "altar sits beyond them beneath the full moon"
            ],
            "visual_inferences": [
              "fixed_element environment_state: wide, continuous ring of worshippers around the fire",
              "fixed_element persistent_prop: rustic stone altar positioned just beyond the circle"
            ],
            "creative_decisions": [
              "wide eye-level dolly framing to geometrically anchor the bonfire in the foreground, worshippers in midground, and altar/moon in the background",
              "high-contrast lighting mixing the intense warm light of the bonfire and the cool ambient glow of the full moon"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "cca4a65a4655d628",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "dd7d0c2e0dade627",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 79,
        "dependency_reason": "이전 샷에서 확립된 숲속 제단 공간의 지형적 레이아웃(모닥불, 제단 바위, 달의 위치) 일관성 유지",
        "_shot_index": 1,
        "visible_entities": [
          "L36"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 105,
            "shot_index": 1
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At eye level from the outer edge of the clearing, the camera begins a slow forward dolly in a wide composition that retains the entire ritual layout. The bonfire occupies less than the lower central quarter, the worshippers form a broad ring around it, and the altar sits beyond them beneath the full moon.",
            "lighting_mood": "The documented bonfire and full-moon light create a low-key, high-contrast ritual tableau with restrained dark tones around the clearing.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [
              "L36"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "ritual_bonfire_and_worshippers",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A massive, fiercely burning bonfire is situated in the center of a dark forest clearing. A wide, continuous circle of worshippers, dressed entirely in black clothing, surrounds the roaring flames.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "활활 드높이 타오르는 모닥불",
                  "불 주변으로 둥그런 원을 그린 수십 명의 검은옷 신도들",
                  "worshippers form a broad ring around it",
                  "ritual circle readable"
                ],
                "visual_inferences": [
                  "The worshippers maintain their circular formation around the fire, visible as a dark ring in the background of closer shots."
                ],
                "creative_decisions": [
                  "Using the bright, high-contrast light of the bonfire to illuminate the inner edges of the worshippers' dark clothing against the deep night."
                ],
                "confidence": "high"
              },
              {
                "element_id": "stone_altar",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A rustic stone altar, consisting of a large rock, stands in the forest clearing. It is positioned just beyond the circle of worshippers, remaining stationary as a focal point of the ritual space.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "바위에 피를 흩뿌린다",
                  "altar sits beyond them beneath the full moon",
                  "altar, and ritual circle readable"
                ],
                "visual_inferences": [
                  "The altar is made of a large, natural, unpolished rock, blending with the rugged forest environment."
                ],
                "creative_decisions": [
                  "Positioning the altar so that it remains distinctly visible behind the worshippers and catches the ambient light."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 79,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "5b4e866dc1d8ff7e"
      },
      {
        "scene_index": 105,
        "heading": "108. 실외. 숲속 만월제 도당 - 밤",
        "beat_title": "강영란의 광기 어린 혈제와 개기 월식의 시작",
        "representative_moment": "흰 무녀복을 입은 C06이 피 묻은 잘린 검은 염소 머리를 허공 높이 치켜들며 제단을 피로 물들인다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height medium framing with upward ascending composition, high-contrast bonfire and moonlight illumination",
            "t2i_prompt": "Photorealistic cinematic still. Viewed from an observer at chest height, the torso of C06O09 in a white robe, an elderly Korean woman, occupies the central middle frame. She stands at a three-quarter angle from the left, torso braced, looking up with her rigid arm locked overhead. Her hand firmly grips C28O00, a severed black goat head with black fur and curved horns, positioned in the upper third of the frame. Fresh dark red blood beads on the goat's profile, dripping down to heavily stain the white fabric. Directly behind her torso, a rustic stone altar made of a large rock anchors the shared ritual space. In the background of this same dark forest clearing, a massive, fiercely burning bonfire rages, surrounded by a wide, continuous circle of worshippers dressed entirely in black clothing. Full-moon illumination from above and the bright, high-contrast firelight separate the white robe from the deep night, catching the inner edges of the worshippers' dark clothing, while the dark red blood provides the strongest color accent.",
            "outfit_assignments": [
              {
                "character_id": "C06",
                "outlook_id": "O09"
              },
              {
                "character_id": "C28",
                "outlook_id": "O00"
              }
            ],
            "source_facts": [
              "S108 action: '잘린 검은 염소 머리를 든 영란이 바위에 피를 흩뿌린다. 그녀의 흰옷은 삽시간에 붉은 피로 물들고...'",
              "S108 action: '활활 드높이 타오르는 모닥불… 불 주변으로 둥그런 원을 그린 수십 명의 검은옷 신도들.'",
              "shot description: 순백의 무녀복을 입은 강영란(흰 머리 여자)이 검붉은 피가 맺힌 잘린 염소 머리를 허공 높이 치켜든 채 정지된 찰나."
            ],
            "visual_inferences": [
              "fixed_element ritual_bonfire_and_worshippers: massive bonfire in the center of a dark forest clearing with a wide, continuous circle of black-clad worshippers.",
              "fixed_element stone_altar: rustic stone altar made of a large rock positioned directly behind C06's torso as a focal point.",
              "The upward gesture of the locked arm holding the goat head creates a vertical ascending line linking the altar, the robe, and the head."
            ],
            "creative_decisions": [
              "Used a chest-height medium framing to place the torso in the center-middle and the goat head in the upper-third, maximizing the impact of the ritual gesture without distortion.",
              "Combined full-moon light and high-contrast firelight to separate the blood-stained white robe from the deep night and dimly lit worshippers in the background."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a191ef1dbea6e639",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "b01530c0bbdff75d",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 79,
        "dependency_reason": "같은 숲속 만월제 도당의 분위기와 공간 연속성 유지 (exact_background)",
        "_shot_index": 3,
        "visible_entities": [
          "C06",
          "C28"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 105,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At chest height several meters before 강영란(흰 머리 여자), the dolly settles as her raised arm reaches its apex, placing her torso in the central middle and the severed goat head in the upper third. A three-quarter body angle keeps the rigid arm, white robe, altar, and ritual circle readable as one ascending line prepared for the subsequent tilt.",
            "lighting_mood": "Bonfire and full-moon illumination hold the white robe against deep surroundings while the dark red blood receives the strongest color accent.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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",
              "C28"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C06",
                "outlook_id": "O09"
              },
              {
                "character_id": "C28",
                "outlook_id": "O00"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "ritual_bonfire_and_worshippers",
                "element_type": "environment_state",
                "character_name": "",
                "description": "A massive, fiercely burning bonfire is situated in the center of a dark forest clearing. A wide, continuous circle of worshippers, dressed entirely in black clothing, surrounds the roaring flames.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "활활 드높이 타오르는 모닥불",
                  "불 주변으로 둥그런 원을 그린 수십 명의 검은옷 신도들",
                  "worshippers form a broad ring around it",
                  "ritual circle readable"
                ],
                "visual_inferences": [
                  "The worshippers maintain their circular formation around the fire, visible as a dark ring in the background of closer shots."
                ],
                "creative_decisions": [
                  "Using the bright, high-contrast light of the bonfire to illuminate the inner edges of the worshippers' dark clothing against the deep night."
                ],
                "confidence": "high"
              },
              {
                "element_id": "stone_altar",
                "element_type": "persistent_prop",
                "character_name": "",
                "description": "A rustic stone altar, consisting of a large rock, stands in the forest clearing. It is positioned just beyond the circle of worshippers, remaining stationary as a focal point of the ritual space.",
                "applies_to_shots": [
                  1,
                  3
                ],
                "element_scope": "full",
                "source_facts": [
                  "바위에 피를 흩뿌린다",
                  "altar sits beyond them beneath the full moon",
                  "altar, and ritual circle readable"
                ],
                "visual_inferences": [
                  "The altar is made of a large, natural, unpolished rock, blending with the rugged forest environment."
                ],
                "creative_decisions": [
                  "Positioning the altar so that it remains distinctly visible behind the worshippers and catches the ambient light."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 79,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C06O09",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "a4a70e3e3138d03b"
      },
      {
        "scene_index": 105,
        "heading": "108. 실외. 숲속 만월제 도당 - 밤",
        "beat_title": "불길한 개기월식의 시작",
        "representative_moment": "짙은 어둠이 하늘의 밝은 보름달 가장자리를 둥글게 가린 기괴한 밤하늘 광경.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Stable skyward wide shot with high-contrast celestial lighting",
            "t2i_prompt": "Photorealistic cinematic still. An eclipsing full moon hangs in the upper-center background, a sharp rounded shadow creeping across its bright edge. The stable skyward composition frames the lunar body surrounded by a vast, deep night sky, occupying a moderate portion of the upper area. The ominous high-contrast celestial view relies solely on the moon's remaining brightness, devoid of any other light sources, making the crisp circular geometry of the encroaching darkness starkly visible against the glowing surface.",
            "outfit_assignments": [],
            "source_facts": [
              "S108 action: '서서히… 개기 월식이 시작되며 어둠이 둥그렇게 보름달을 먹어가기 시작한다.'",
              "shot description: ominous night sky spectacle of a lunar eclipse with deep darkness circularly covering the edge of a bright full moon",
              "DP instructions: upward tilt settles into a stable skyward composition, moon remains below forty percent of the image area near the upper center"
            ],
            "visual_inferences": [
              "ground elements are entirely excluded to focus solely on the celestial event in the night sky",
              "high-contrast lighting isolates the glowing moon against a pitch-black void"
            ],
            "creative_decisions": [
              "placed the eclipsing full moon explicitly in the upper-center background per the frame spatial contract",
              "emphasized the crisp circular geometry of the shadow to convey the unnatural, ominous mood of the ritual's climax"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "e8105a01c22b9c25",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a7d852b4bf584f53",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 79,
        "dependency_reason": "previous_shot_refs indicates a locational continuity connection, though background mode is off as it is a direct skyward shot.",
        "_shot_index": 7,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 105,
            "shot_index": 7
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "The upward tilt from near the altar settles into a stable skyward composition once the rounded shadow becomes unmistakable along the moon's edge. The moon remains below forty percent of the image area near the upper center, surrounded by enough night sky to make the encroaching darkness legible.",
            "lighting_mood": "The moon's remaining brightness is isolated against the deep night sky, producing an ominous high-contrast celestial image without additional light sources.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "eclipsing full moon",
                  "screen_zone": "upper_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 79,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "009a3d8b95937bcc"
      },
      {
        "scene_index": 106,
        "heading": "109. 다시 반월 식당 앞 - 밤",
        "beat_title": "피칠갑을 한 고산들의 등장과 신물 획득",
        "representative_moment": "피를 뒤집어쓴 C08이 흰 사슴뿔 창을 든 채 식당 밖으로 걸어 나온다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height wide shot, low-key ambient night illumination",
            "t2i_prompt": "Photorealistic cinematic still. C08O11 in a dark jacket, an Asian middle-aged man, at three-quarter angle from the right, visibly covered in blood, caught in mid-step emerging from the open restaurant doorway. He is gazing into the distance. His spear arm is lowered, hand gripping a white antler spear; the branching upper section is held at his side while the pointed end hangs toward the ground in the lower third of the frame beside his leg. The camera is positioned at chest height outside the doorway, framing his head and upper body in the central vertical band while his lower legs extend toward the bottom edge. Behind him, the open doorway reveals a partially visible dark restaurant hall floor obliquely. Low-key ambient night illumination separates the pale white antler spear and the dark, blood-stained figure without a specific exterior light source. The focus is on the tense spatial relationship between the blood-soaked figure and the stark white antler spear against the dark threshold.",
            "outfit_assignments": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "source_facts": [
              "S106 action: '문을 열고 피칠갑을 한 산들이 식당에서 나온다. 창 하나를 들고 있다'",
              "shot description: 고산들이 황봉업을 죽이고 신물(흰 사슴뿔 창)을 얻어 밖으로 나옴"
            ],
            "visual_inferences": [
              "mid-step pose to capture the momentary action of stepping out",
              "lowered spear positioning to create a pale downward line beside the figure",
              "restaurant hall floor seen obliquely through the open doorway as background context"
            ],
            "creative_decisions": [
              "chest-height camera framing to capture both the upper body and the downward-pointing spear in the lower third",
              "low-key ambient night lighting to emphasize the contrast between the white antler and the dark, blood-covered character"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "6f9ffe29eb74c51f",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "4e3f62ca0b174178",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 91,
        "dependency_reason": "이전 씬에 묘사된 식당 앞 공간과 밤의 분위기 연속성 유지",
        "_shot_index": 2,
        "visible_entities": [
          "C08"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 106,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Outside the open doorway at chest height, the forward dolly settles at a full-body distance directly before 고산들 as he completes a step out of the restaurant. His blood-covered figure occupies the central vertical band, while the lowered white antler spear runs beside his leg into the lower third and the open doorway remains visible behind him for the coming lateral reveal.",
            "lighting_mood": "Low-key ambient illumination appropriate to the night setting separates the white antler spear and blood-covered figure without inventing a specific exterior source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "constraints": [
              "one prompt captures one still moment",
              "do not combine full-body framing and body-part close-up in one frame",
              "camera position and frame-edge elements must be geometrically consistent — see render_strategy.spatial_consistency.camera_frame_rule",
              "two characters in fg/bg separation must share a named surface/space anchor — see render_strategy.spatial_consistency.fg_bg_shared_anchor_rule",
              "framing_scale binds entity rendering — close = primary subject only fully visible, wide/medium = no body-part close-up — see render_strategy.spatial_consistency.primary_framing_rule"
            ]
          },
          "id_policy": {
            "allowed_base_entity_ids": [
              "C08"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C08",
                "outlook_id": "O11"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 91,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C08O11",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "783d75bdd7a988bd"
      },
      {
        "scene_index": 107,
        "heading": "110. 실외. 숲 속 - 밤",
        "beat_title": "공포에 질려 숲을 내달리는 구창모",
        "representative_moment": "C15 is caught mid-sprint in the pitch-dark forest, branches grazing his tear-filled face as he runs in sheer terror.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "tracking backward close framing at face height, extremely low-key night lighting",
            "t2i_prompt": "Photorealistic cinematic still. C15O19 in a casual shirt, an East Asian middle-aged man with a slender face and tan skin, occupies the middle-center midground, moving toward the forest path ahead. Framed close at face height, he is caught mid-sprint at a three-quarter angle from the right, his tear-filled eyes gazing off-screen in sheer terror. His head pushes forward, his short black hair streaming backward in the direction opposite to his motion. Extremely low-key night ambience swallows the immediate surroundings in near total blackness, leaving only faint, cool rim light to define his strained jawline and catch the wet highlights on his cheeks. At the frame edges, out-of-focus dark branches and brush graze the boundary, their projecting ends angling sharply past his face to emphasize the frantic forward momentum.",
            "outfit_assignments": [
              {
                "character_id": "C15",
                "outlook_id": "O19"
              }
            ],
            "source_facts": [
              "C15 is running frantically through the dark forest.",
              "C15 is in extreme terror, crying.",
              "Branches and brush are hitting his face."
            ],
            "visual_inferences": [
              "close framing at face height isolating his terrified expression",
              "extremely low-key lighting highlighting tears and strained jawline against a black background",
              "mid-sprint posture with hair flying backward"
            ],
            "creative_decisions": [
              "blurring the frame-edge branches to create a sense of forward motion",
              "using cool rim light to separate his dark skin from the pitch-black environment"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [
              {
                "owned_token": "branch",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "grass",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "leaf litter",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "path",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rock",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrub",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "tree",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "vine",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "c413c02fe4068258",
              "owned_hash": "779fc7e8f997eef6",
              "camera_direction_hash": "8787911ce0a983fa",
              "owned_usage_hash": "e22960420f9dcb94",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 66,
        "dependency_reason": "maintains the extremely dark night atmosphere and general forest mood established in scene 66, although the direct background reference is skipped due to close framing.",
        "_shot_index": 3,
        "visible_entities": [
          "C15"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 107,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track backward at face height directly ahead of 구창모, tightening into a close frame while preserving the vertical jolt of his sprint and the backward stream of his hair. His tear-filled face occupies the center-left, with fragments of the dark path, approaching branches, and brush slipping past the frame edges to sustain forward momentum.",
            "lighting_mood": "Extremely low-key night ambience leaves the forest nearly black while retaining tear highlights and the strained contours of 구창모's face.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "movement_direction",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "moves_toward",
                  "gesture_target_label": "forest path ahead",
                  "label": "구창모",
                  "screen_zone": "middle_center",
                  "target_id": "C15",
                  "target_kind": "character"
                }
              ]
            },
            "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": [
              "C15"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C15",
                "outlook_id": "O19"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L53B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 66,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C15O19",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "d46cf9bf7e0eee91"
      },
      {
        "scene_index": 108,
        "heading": "111. 실내. 도축장 - 밤",
        "beat_title": "천장에서 떨어지는 피와 발견",
        "representative_moment": "A single thick drop of dark-red blood hitting the back of a trembling hand gripping a door handle.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Hold static at hand height in an isolated insert, aimed slightly upward",
            "t2i_prompt": "Photorealistic cinematic still. Shot from hand height, aimed slightly upward. In the center of the frame, a single thick drop of dark-red blood rests exactly at the point of contact on the back of the trembling hand of a Korean middle-aged man. The hand tightly grips a side-door handle, its graspable side facing the camera at an oblique angle, providing scale. The background consists of a narrow upper strip of an indoor warehouse ceiling immersed in deep, near-black shadows. Low-key ambient night illumination isolates the blood and the hand without any visible light sources, leaving the upper background completely dark and oppressive.",
            "outfit_assignments": [],
            "source_facts": [
              "S111 action: '갑자기 위에서 시럽 같이 찐득한 액체가 쭈욱- 떨어진다. 손으로 받아보니, 검붉은 피다.'",
              "shot description: drop of blood hitting the back of the trembling hand gripping the side-door handle"
            ],
            "visual_inferences": [
              "fixed_element environment_state: The ceiling is immersed in deep, near-black shadows with minimal ambient illumination",
              "the exact point of contact sits near the center of the frame",
              "the graspable side of the handle faces the camera at an oblique angle"
            ],
            "creative_decisions": [
              "Insert framing scale isolates only the hand and the door handle to comply with the primary_framing_rule for close framing",
              "Aimed slightly upward to include the narrow upper background of the dark ceiling, motivating the character's upward gaze"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d3f6575e9c528c66",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "0c9719d52a97e35b",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 105,
        "dependency_reason": "previous_shot_refs dictates exact_background location consistency with S105_Shot7",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 108,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "insert",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Hold static at hand height in an isolated insert, aimed slightly upward beneath the drop so the exact point of contact sits near the center of the frame. The back of 구창모's trembling hand and part of his grip on the side-door handle provide scale, while the dark ceiling remains as a narrow upper background that motivates the coming upward tilt.",
            "lighting_mood": "Low-key ambient illumination appropriate to the night interior isolates the dark-red blood against the hand without introducing a visible light source.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dark_ceiling_background",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The ceiling of the indoor warehouse is immersed in deep, near-black shadows. The low-key night lighting provides minimal ambient illumination, leaving the upper background completely dark without any visible light sources, creating an oppressive atmosphere.",
                "applies_to_shots": [
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "dark ceiling remains as a narrow upper background",
                  "ceiling falls into near-blackness",
                  "Sparse low-key night-interior illumination"
                ],
                "visual_inferences": [
                  "The ceiling is part of an unlit industrial space with rough textures largely obscured by the heavy shadows."
                ],
                "creative_decisions": [
                  "Keeping the lighting extremely sparse and the ceiling pitch-black to isolate the subjects and emphasize the claustrophobic horror of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 105,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "01f909de42e6f866"
      },
      {
        "scene_index": 108,
        "heading": "실내. 도축장 - 밤",
        "beat_title": "천장에 매달린 산들의 섬뜩한 등장",
        "representative_moment": "어두운 천장에 거꾸로 매달린 기괴한 남자의 얼굴이 카메라(창모의 시점)를 섬뜩하게 내려다보고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "subjective steep low-angle close-up, sparse low-key lighting",
            "t2i_prompt": "Photorealistic cinematic still. A steep low-angle close-up from a subjective point of view looking directly upward. The inverted face of a Korean young man occupies most of the center frame, suspended upside down and facing the camera. His neck is craned, with feral eyes fixed directly on the camera lens in a predatory glare. Sparse low-key night-interior illumination catches the stark planes of his inverted facial features. The narrow upper background behind him consists of a rough indoor ceiling immersed in deep, near-black shadows, completely dark without any visible light sources, creating an oppressive atmosphere.",
            "outfit_assignments": [],
            "source_facts": [
              "shot description: Steep low-angle close-up on San-deul's inverted face from Chang-mo's eye line directly below.",
              "S108 action: San-deul is hanging from the ceiling, glaring as if to eat Chang-mo."
            ],
            "visual_inferences": [
              "fixed_element dark_ceiling_background: The ceiling of the indoor warehouse is immersed in deep, near-black shadows.",
              "San-deul's inverted features occupy most of the center frame, with only a thin margin of ceiling visible around his face."
            ],
            "creative_decisions": [
              "Keeping the lighting extremely sparse and the ceiling pitch-black to isolate the subject and emphasize the claustrophobic horror.",
              "Using a strict subjective low-angle to maximize the shock of the upside-down face staring directly into the lens."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "b96881de1c02719a",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "244322455d0df955",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 105,
        "dependency_reason": "동일한 창고 공간의 어두운 천장 배경 및 야간 저조도 조명 환경 연속성 유지",
        "_shot_index": 9,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 108,
            "shot_index": 9
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From 구창모's eye line directly below, hold a steep low-angle close-up on 고산들's inverted face after the upward reveal has settled. His upside-down features occupy most of the center frame, with only a thin margin of ceiling retained to prove that he is suspended above the viewer.",
            "lighting_mood": "Sparse low-key night-interior illumination catches 고산들's predatory eyes and facial planes while the ceiling falls into near-blackness.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "dark_ceiling_background",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The ceiling of the indoor warehouse is immersed in deep, near-black shadows. The low-key night lighting provides minimal ambient illumination, leaving the upper background completely dark without any visible light sources, creating an oppressive atmosphere.",
                "applies_to_shots": [
                  6,
                  9
                ],
                "element_scope": "full",
                "source_facts": [
                  "dark ceiling remains as a narrow upper background",
                  "ceiling falls into near-blackness",
                  "Sparse low-key night-interior illumination"
                ],
                "visual_inferences": [
                  "The ceiling is part of an unlit industrial space with rough textures largely obscured by the heavy shadows."
                ],
                "creative_decisions": [
                  "Keeping the lighting extremely sparse and the ceiling pitch-black to isolate the subjects and emphasize the claustrophobic horror of the scene."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 105,
                "shot_index": 7,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "36f58fa64a14c88d"
      },
      {
        "scene_index": 109,
        "heading": "112. 실외. 염소 축사 - 밤",
        "beat_title": "광란하는 검은 염소 떼의 기괴한 울부짖음",
        "representative_moment": "기괴하게 뒤틀린 검은 염소들의 머리와 날카로운 뿔, 번뜩이는 황금빛 눈동자가 프레임을 빽빽하게 채우고 있다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Low-angle close framing slightly below goat-eye height with high-contrast low-key night lighting",
            "t2i_prompt": "Photorealistic cinematic still. Seen from slightly below goat-eye height, a tightly compressed, overlapping mass of black goats fills the frame at an oblique angle. The herd's fur is rendered deep blue-black under low-key night illumination, while piercing golden eyes puncture the heavy darkness with hard contrast, serving as multiple points of focus across the layered heads. Sharp, interlacing horns cut aggressively through the upper and middle bands of the frame, angling toward the lens. Along the lower and side edges, twisted necks and wide-open mouths are frozen mid-bleat, emphasizing the chaotic depth. At the extreme outer edges, the faint wooden texture of the dark pen enclosure is barely visible against the pitch-black background, completely overwhelmed by the frantic, packed bodies.",
            "outfit_assignments": [],
            "source_facts": [
              "S112 action: '검은 염소 떼는 더욱 미친 듯 매에에- 메에에- 울어댄다.'",
              "shot description: 기괴하게 입을 벌린 채 몸을 한껏 뒤튼 검은 염소 떼의 뿔과 황금빛 눈동자 클로즈업"
            ],
            "visual_inferences": [
              "low-angle perspective slightly below eye level emphasizes the tangled, threatening mass of horns",
              "golden eyes create striking contrast against the dark blue-black fur in the night environment",
              "overlapping heads compress the depth, intensifying the claustrophobic and grotesque mood"
            ],
            "creative_decisions": [
              "pushed the wooden pen structure to the extreme out-of-focus edges to isolate the chaotic animal faces as the dominant subject",
              "placed the open mouths along the lower boundaries to frame the piercing golden eyes in the center"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bucket",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fence",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "goat shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lamp",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "storage shed",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "timber pile",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "trough",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "utility pole",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "5732739b6b1729bc",
              "owned_hash": "aba12590c8be5549",
              "camera_direction_hash": "3287f0fb09d26c54",
              "owned_usage_hash": "b20fdd7695dc5d8f",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 66,
        "dependency_reason": "이전 염소 축사 씬(S66)의 연속선상에 있는 시공간적 분위기 및 동물 피사체(검은 염소 떼)의 시각적 일관성 유지",
        "_shot_index": 2,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 109,
            "shot_index": 2
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Complete the dolly-in slightly below goat-eye height, angling across several overlapping heads rather than confronting a single animal squarely. Horns and golden eyes fill the central bands without exceeding natural scale, while open mouths remain visible along the lower and side edges and additional bodies recede behind them.",
            "lighting_mood": "Low-key night illumination renders the herd blue-black while the explicitly golden eyes puncture the darkness with hard contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L53B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [],
            "previous_shot_refs": [
              {
                "scene_index": 66,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "c13d53faa1a2fb8a"
      },
      {
        "scene_index": 110,
        "heading": "113. 실외. 숲 속 만월제 도당 - 밤",
        "beat_title": "악령에 빙의된 수리영의 각성",
        "representative_moment": "얼굴에 검은 히브리 문자가 새겨지고 황금빛 눈을 번뜩이는 여인의 얼굴 클로즈업.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Extreme close-up on the face from a direct frontal axis, low-key high-contrast blood-red lighting",
            "t2i_prompt": "Photorealistic cinematic still. A Korean young woman facing the camera directly in an extreme close-up, her face dominating the frame with her glowing golden eyes positioned in the upper center. Her wide, unblinking eyes are fixed on the camera, their unnatural golden light serving as the brightest accents in the shot. Intricate, black ink-like Hebrew characters are densely tattooed across her skin, spreading clearly over her forehead, cheeks, and facial contours, contrasting sharply against her flesh. Her neck and shoulders are tense, straining against thick leather bindings visible just at the bottom edge of the frame. The scene is bathed in a harsh, low-key, blood-red illumination, casting severe, high-contrast pitch-black shadows across her features from the unseen ritual fire. Only a thin, out-of-focus trace of a dark rock and the crimson-tinted ritual space is visible at the extreme boundary of the frame behind her.",
            "outfit_assignments": [],
            "source_facts": [
              "얼굴에 문자가 새겨진 김지후(강수리영)가 섬뜩한 황금빛 눈동자를 번뜩이며 두 눈을 크게 부릅뜨고 있는 얼굴 클로즈업.",
              "마치 피가 혈관을 타고 흐르듯 촤르르르륵 검은 먹물로 그린 문양 같은 히브리 문자가 문신처럼 생겨나기 시작한다.",
              "두 눈이 그분의 황금빛 눈으로 빛난다!"
            ],
            "visual_inferences": [
              "fixed_element character_state: su_ri_young_demonic_face (glowing golden eyes, black ink-like Hebrew characters)",
              "fixed_element environment_state: blood_red_environmental_lighting (blood-red illumination, severe high contrast)",
              "Neck muscles tense to visually represent straining against the bindings even within a tight facial close-up"
            ],
            "creative_decisions": [
              "Positioned the glowing golden eyes in the upper center of the frame to maximize the occult confrontation effect directed at the observer",
              "Utilized extreme high-contrast lighting to ensure the black characters remain legible against the blood-red skin tones",
              "Kept the background elements restricted to a thin, out-of-focus trace at the frame margins to adhere to the close framing scale"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "7a8777412f1202fb",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "d4d4fc60af6fa6d6",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 58,
        "dependency_reason": "만월제 도당 공간의 붉은 달과 화톳불 조명, 중앙 제단 바위라는 동일 배경 요소를 공유",
        "_shot_index": 21,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 110,
            "shot_index": 21
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "End the frontal dolly-in at an extreme close distance at 김지후(강수리영)'s face height, using the direct axis as an occult confrontation rather than a neutral portrait. Her widened golden eyes sit across the upper center while the spreading characters remain legible over her cheeks and forehead, with only a thin trace of the ritual space at the frame boundary.",
            "lighting_mood": "Blood-red illumination from the revealed red full moon and the ritual fire shapes her marked face in severe high contrast, with the golden eyes as the brightest accents.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "su_ri_young_demonic_face",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Her irises glow brightly with an unnatural, striking golden light. Intricate, black ink-like Hebrew characters are densely tattooed across her face and skin. These dark markings remain highly visible and contrast sharply against her skin, marking her possessed state.",
                "applies_to_shots": [
                  21,
                  41
                ],
                "element_scope": "close",
                "source_facts": [
                  "얼굴에 문자가 새겨진 김지후(강수리영)가 섬뜩한 황금빛 눈동자를 번뜩이며",
                  "마치 피가 혈관을 타고 흐르듯 촤르르르륵 검은 먹물로 그린 문양 같은 히브리 문자가 문신처럼 생겨나기 시작한다",
                  "두 눈이 그분의 황금빛 눈으로 빛난다!"
                ],
                "visual_inferences": [
                  "The black text appears embedded in the skin like spreading veins, retaining clarity even when shadows or blood obscure other parts of her face later on."
                ],
                "creative_decisions": [
                  "The glowing golden eyes are rendered as the brightest focal point on her face to emphasize the terrifying, otherworldly nature of the possession."
                ],
                "confidence": "high"
              },
              {
                "element_id": "blood_red_environmental_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The entire ritual space is bathed in a harsh, low-key, blood-red illumination cast by a red full moon in the dark sky. Intense, high-contrast black shadows are formed by the combination of the red moonlight and the burning ritual fire. All objects, characters, and surroundings reflect this deep, hellish crimson tint.",
                "applies_to_shots": [
                  21,
                  25,
                  41
                ],
                "element_scope": "full",
                "source_facts": [
                  "칠흑 같이 어두웠던 하늘에서 붉은 보름달이 모습을 드러낸다. 그에 따라 온 세상도 핏빛 붉은 세상으로 탈바꿈",
                  "Blood-red illumination from the revealed red full moon and the ritual fire",
                  "harsh blood-red, high-contrast illumination",
                  "The red full moon casts the explicitly blood-red world in low-key, high-contrast light"
                ],
                "visual_inferences": [
                  "The sky takes on a very dark, reddish-black hue, and normal night-time cool tones are completely overridden by the saturated red."
                ],
                "creative_decisions": [
                  "Extreme chiaroscuro with aggressive red highlights and pitch-black shadows is used to amplify the chaotic and apocalyptic atmosphere of the massacre."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 58,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "a1b45be4c62aa196"
      },
      {
        "scene_index": 110,
        "heading": "113. 실외. 숲 속 만월제 도당 - 밤",
        "beat_title": "고산들의 일격과 강영란의 치명상",
        "representative_moment": "고산들이 쥔 하얀 사슴뿔 창이 돌아서던 강영란의 가슴팍을 거칠게 꿰뚫는 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Observer view at chest height, medium framing on the torsos with high-contrast crimson lighting",
            "t2i_prompt": "Photorealistic cinematic still. Observer view at chest height. In the left midground, an Asian young man in dark clothing, in right profile, lunging forward with his torso angled into the thrust, torsos and arms in frame, eyes fixed on the woman. He forcefully drives a white antler spear that crosses the space between them. In the center-right, an Asian elderly woman with white hair in dark ceremonial robes, at three-quarter angle from the left, twisting into the spear impact, visibly wounded with a pained expression, eyes fixed on the young man. The white spear forms an uninterrupted diagonal attack line, its point embedded directly through the elderly woman's chest. The side of a central stone altar and a giant rock remain visible in the background behind the attack line as a stable spatial reference. The entire ritual space is bathed in a harsh, low-key, blood-red illumination cast by a red full moon in the dark sky and a burning ritual fire, creating intense high-contrast black shadows and reflecting a deep crimson tint across the figures, the white spear, and the surroundings.",
            "outfit_assignments": [],
            "source_facts": [
              "S113 action: 영란을 향해 흰사슴뿔 창을 있는 힘껏 찔러넣는다: 돌아서던 영란의 가슴팍을 푸욱- 꿰뚫고 들어가는 창끝!",
              "Shot description: 고산들이 난입해 하얀 사슴뿔 창으로 영란을 꿰뚫는 순간"
            ],
            "visual_inferences": [
              "fixed_element blood_red_environmental_lighting: The entire ritual space is bathed in a harsh, low-key, blood-red illumination cast by a red full moon",
              "The white antler spear acts as a physical shared anchor bridging the spatial gap between the attacker and the victim"
            ],
            "creative_decisions": [
              "Framed at chest height to emphasize the diagonal line of the thrust crossing the midground, capturing both figures' upper bodies and the impact point",
              "Utilized intense low-key crimson lighting to amplify the violent tension and apocalyptic mood of the moment"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "aaa0d6b2d258b42e",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "aec9a5498f49f50f",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 75,
        "dependency_reason": "만월제 도당 공간 및 배경 연속성 참조",
        "_shot_index": 25,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 110,
            "shot_index": 25
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Track laterally at chest height beside the altar and briefly hold the composition at the instant 고산들's thrust crosses the frame into 강영란(흰 머리 여자)'s chest. Keep 고산들 in the left midground and 강영란 in the center-right, their profiles and the white antler spear forming one uninterrupted attack line while the altar remains behind them as spatial reference.",
            "lighting_mood": "The red full moon and active ritual fire cast a harsh blood-red, high-contrast illumination over the white spear and the impact.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "blood_red_environmental_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The entire ritual space is bathed in a harsh, low-key, blood-red illumination cast by a red full moon in the dark sky. Intense, high-contrast black shadows are formed by the combination of the red moonlight and the burning ritual fire. All objects, characters, and surroundings reflect this deep, hellish crimson tint.",
                "applies_to_shots": [
                  21,
                  25,
                  41
                ],
                "element_scope": "full",
                "source_facts": [
                  "칠흑 같이 어두웠던 하늘에서 붉은 보름달이 모습을 드러낸다. 그에 따라 온 세상도 핏빛 붉은 세상으로 탈바꿈",
                  "Blood-red illumination from the revealed red full moon and the ritual fire",
                  "harsh blood-red, high-contrast illumination",
                  "The red full moon casts the explicitly blood-red world in low-key, high-contrast light"
                ],
                "visual_inferences": [
                  "The sky takes on a very dark, reddish-black hue, and normal night-time cool tones are completely overridden by the saturated red."
                ],
                "creative_decisions": [
                  "Extreme chiaroscuro with aggressive red highlights and pitch-black shadows is used to amplify the chaotic and apocalyptic atmosphere of the massacre."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 75,
                "shot_index": 2,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "5564ccf25f7b4ed1"
      },
      {
        "scene_index": 110,
        "heading": "실외. 숲 속 만월제 도당 - 밤",
        "beat_title": "핏빛 지옥도와 강수리영의 완전한 각성",
        "representative_moment": "붉은 보름달 아래, 온몸에 검은 문자가 새겨진 강수리영이 육혈귀들의 핏빛 참상을 차분히 내려다본다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Slightly elevated wide position with harsh, low-key blood-red illumination",
            "t2i_prompt": "Photorealistic cinematic still. Seen from a slightly elevated wide perspective with her full body visible, a blood-drenched Korean young woman stands at the visual center at three-quarter angle from the left, looking down at the ground, while the altar and surrounding carnage are visible in the lower-right background. She remains vertically composed and still, her feet planted amid a pile of bodies, sharing the same blood-soaked [L20: dark forest clearing] they all occupy. Her irises glow brightly with an unnatural, striking golden light. Intricate, black ink-like Hebrew characters are densely tattooed across her face and skin, remaining highly visible and contrasting sharply against her flesh. In the lower foreground and along both sides, violent clusters of Korean village figures are frozen mid-grapple, biting into each other, their faces looking away with eyes fixed off-screen. The entire ritual space is bathed in a harsh, low-key, blood-red illumination cast by a red full moon in the dark sky. Intense, high-contrast black shadows are formed by the combination of the red moonlight and burning ritual fires, reflecting a deep, hellish crimson tint across the central figure and the frenzied crowd.",
            "outfit_assignments": [],
            "source_facts": [
              "S113 action: '붉은 달 아래, 붉은 세상에서 펼쳐지는 아비규환 핏빛 광란의 지옥도!!'",
              "shot description: '온몸이 피범벅이 된 강수리영이 차분한 표정으로 참상을 내려다보는 꼿꼿한 전신.'",
              "shot description: '육혈귀들이 서로를 뜯어먹는 핏빛 지옥도 한가운데'"
            ],
            "visual_inferences": [
              "fixed_element character_state: 'su_ri_young_demonic_face' applied to the central woman, showing golden irises and black Hebrew tattoos.",
              "fixed_element environment_state: 'blood_red_environmental_lighting' applied to cast the entire scene in deep crimson and black shadows."
            ],
            "creative_decisions": [
              "Utilized a slightly elevated wide angle to naturally include the full body of the central figure while showcasing the altar in the background and the carnage in the foreground.",
              "Added explicit shared spatial anchor ('sharing the same blood-soaked forest clearing they all occupy') to firmly ground all characters in a single physical location without blending their distinct actions."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "36a5d67aa137e3eb",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "f5b9d37fcc9fa1a9",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 70,
        "dependency_reason": "동일한 숲 속 만월제 도당 배경(S70_Shot3)의 공간적 연속성 유지",
        "_shot_index": 41,
        "visible_entities": [
          "L20"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 110,
            "shot_index": 41
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Settle the backward crane at a slightly elevated wide position, preserving 김지후(강수리영)'s full body at the visual center while violent clusters occupy the lower foreground and both sides. She remains vertically composed and still amid circling diagonals of bodies, with the altar and red moon anchoring the deeper ritual space rather than replacing the carnage as the focus.",
            "lighting_mood": "The red full moon casts the explicitly blood-red world in low-key, high-contrast light, catching blood across 김지후(강수리영) and the surrounding bodies.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "shared_space_relation",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "background",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "altar and surrounding carnage",
                  "screen_zone": "lower_right",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [
              "L20"
            ],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "su_ri_young_demonic_face",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Her irises glow brightly with an unnatural, striking golden light. Intricate, black ink-like Hebrew characters are densely tattooed across her face and skin. These dark markings remain highly visible and contrast sharply against her skin, marking her possessed state.",
                "applies_to_shots": [
                  21,
                  41
                ],
                "element_scope": "close",
                "source_facts": [
                  "얼굴에 문자가 새겨진 김지후(강수리영)가 섬뜩한 황금빛 눈동자를 번뜩이며",
                  "마치 피가 혈관을 타고 흐르듯 촤르르르륵 검은 먹물로 그린 문양 같은 히브리 문자가 문신처럼 생겨나기 시작한다",
                  "두 눈이 그분의 황금빛 눈으로 빛난다!"
                ],
                "visual_inferences": [
                  "The black text appears embedded in the skin like spreading veins, retaining clarity even when shadows or blood obscure other parts of her face later on."
                ],
                "creative_decisions": [
                  "The glowing golden eyes are rendered as the brightest focal point on her face to emphasize the terrifying, otherworldly nature of the possession."
                ],
                "confidence": "high"
              },
              {
                "element_id": "blood_red_environmental_lighting",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The entire ritual space is bathed in a harsh, low-key, blood-red illumination cast by a red full moon in the dark sky. Intense, high-contrast black shadows are formed by the combination of the red moonlight and the burning ritual fire. All objects, characters, and surroundings reflect this deep, hellish crimson tint.",
                "applies_to_shots": [
                  21,
                  25,
                  41
                ],
                "element_scope": "full",
                "source_facts": [
                  "칠흑 같이 어두웠던 하늘에서 붉은 보름달이 모습을 드러낸다. 그에 따라 온 세상도 핏빛 붉은 세상으로 탈바꿈",
                  "Blood-red illumination from the revealed red full moon and the ritual fire",
                  "harsh blood-red, high-contrast illumination",
                  "The red full moon casts the explicitly blood-red world in low-key, high-contrast light"
                ],
                "visual_inferences": [
                  "The sky takes on a very dark, reddish-black hue, and normal night-time cool tones are completely overridden by the saturated red."
                ],
                "creative_decisions": [
                  "Extreme chiaroscuro with aggressive red highlights and pitch-black shadows is used to amplify the chaotic and apocalyptic atmosphere of the massacre."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 70,
                "shot_index": 3,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "684dbf158af375cb"
      },
      {
        "scene_index": 111,
        "heading": "114. 같은 장소 - 잠시 후",
        "beat_title": "가슴에 꽂히는 사슴뿔 목걸이",
        "representative_moment": "정인우가 쥔 사슴뿔 목걸이가 수리영의 가슴팍에 깊숙이 꽂히는 클로즈업 순간.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "chest-height tight close frame, stark low-key contrast from moonlight",
            "t2i_prompt": "Photorealistic cinematic still. At chest height in a tight close frame, focusing on a forceful physical strike. An East Asian man, seen over his shoulder in the lower-left foreground, his forearm entering diagonally, his gripping hand driving a sharp white antler necklace deep into the chest of an East Asian woman. The woman, positioned at three-quarter angle from the left, her torso recoiling toward the upper-right from the intense impact, visibly wounded with a pained expression. The sharp pointed end of the necklace is directed from the lower-left squarely into the front of her chest, acting as the physical anchor connecting the figure exerting force and the figure receiving the impact. Both figures are looking off-screen. Clear, stark full-moon light from above bathes the immediate surroundings, creating strong low-key contrasts and deep shadows across their arms and chests. In the heavily blurred rear-plane background, out-of-focus shapes of a devastated corpse-strewn ground and dark pools of blood are softly visible.",
            "outfit_assignments": [],
            "source_facts": [
              "정인우가 쥔 녹각 목걸이가 수리영의 가슴팍을 깊숙히 파고든다",
              "Clear full-moon light after the eclipse renders the impact in stark low-key contrast",
              "corpse-strewn ground",
              "죽어 널부러진 육혈귀와 인간의 시체들… 피가 좁은 내를 이뤄 흐르고, 질퍽한 핏빛 웅덩이도 여기저기 패여있다"
            ],
            "visual_inferences": [
              "Tight framing on the chest and hands emphasizes the physical force and ownership of the strike",
              "The background bodies and blood are heavily blurred to keep the focus entirely on the necklace and the immediate reaction"
            ],
            "creative_decisions": [
              "Using a diagonal composition from lower-left to upper-right to visually enhance the dynamic tension and the direction of the forceful impact",
              "Applying stark low-key moonlight to cast harsh shadows, amplifying the dark occult thriller tone"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "brazier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "herb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "offering table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "power cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ritual circle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ritual drum",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrine",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smoke",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "talisman",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "ee71902dc5d89772",
              "owned_hash": "8dcb673d49d1e90f",
              "camera_direction_hash": "bb9eb628f661f608",
              "owned_usage_hash": "0cb10e990fd000e6",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 60,
        "dependency_reason": "동일한 장소(만월제 도당)의 배경 분위기 참조",
        "_shot_index": 11,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 111,
            "shot_index": 11
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Begin the dolly-out at chest height in a tight close frame, centering the point where 정인우's hand drives the sharp antler necklace into 김지후(강수리영)'s chest. His forearm enters diagonally from the lower-left as her torso recoils toward the upper-right, leaving enough of both bodies visible to make the force and ownership of the strike unambiguous.",
            "lighting_mood": "Clear full-moon light after the eclipse renders the impact in stark low-key contrast against the devastated surroundings.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L27B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "clear_moonlight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is bathed in clear, stark light from a full moon in the night sky. This illumination creates strong low-key contrasts with deep shadows across the entire area.",
                "applies_to_shots": [
                  11,
                  14,
                  19
                ],
                "element_scope": "full",
                "source_facts": [
                  "Clear full-moon light after the eclipse renders the impact in stark low-key contrast",
                  "Clear full-moon light outlines the dense black smoke",
                  "Clear full-moon light catches the falling tears"
                ],
                "visual_inferences": [
                  "The light is cold, singular, and highly directional from above, casting harsh shadows."
                ],
                "creative_decisions": [
                  "Using the pristine moonlight to dramatically highlight the gruesome aftermath and emotional peaks."
                ],
                "confidence": "high"
              },
              {
                "element_id": "corpse_strewn_ground",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The ground is a devastated battlefield covered with scattered dead bodies. Dark puddles of blood are pooled on the uneven surface among the corpses.",
                "applies_to_shots": [
                  11,
                  19
                ],
                "element_scope": "full",
                "source_facts": [
                  "devastated surroundings",
                  "corpse-strewn ground",
                  "죽어 널부러진 육혈귀와 인간의 시체들… 피가 좁은 내를 이뤄 흐르고, 질퍽한 핏빛 웅덩이도 여기저기 패여있다"
                ],
                "visual_inferences": [
                  "The bodies form irregular mounds in the background, making the terrain look chaotic and horrific."
                ],
                "creative_decisions": [
                  "Keeping the gruesome details of the bodies slightly subdued in the background shadows to focus on the main characters' actions and emotions."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 60,
                "shot_index": 9,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "b2aced060c043506"
      },
      {
        "scene_index": 111,
        "heading": "114. 같은 장소 - 잠시 후",
        "beat_title": "가슴을 찌른 후 빠져나오는 검은 연기",
        "representative_moment": "무릎 꿇은 수리영의 몸에서 검은 연기가 빠져나오고, 가슴에 박힌 사슴뿔은 재가 되어 흩어진다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Observer POV with medium framing, keeping the body in the lower center while focusing on the upward movement, stark low-key moonlight contrast",
            "t2i_prompt": "Photorealistic cinematic still. An Asian young woman kneels in the lower center of the frame at a three-quarter angle from the right, her torso folding inward, looking down with a visibly wounded, pained expression. At her chest, a white antler necklace crumbles into falling ash. Dense black smoke curls upward from her wounded torso, rising through the middle and upper frame, the dark form facing away and gazing off-screen. The environment is bathed in clear, stark light from a full moon in the night sky, creating strong low-key contrasts and deep shadows. The crisp moonlight outlines the dense black smoke against the night and preserves the kneeling figure in severe, restrained contrast. The lower and side background reveals a dark aftermath, with a wide bloodstain pooling on the shadowed ground.",
            "outfit_assignments": [],
            "source_facts": [
              "녹각 목걸이가 수리영의 가슴팍을 깊숙히 파고든다",
              "풀썩 무릎을 꿇는다",
              "그녀 몸에서 스르륵 빠져나오는 검은 연기",
              "가슴을 꿰뚫은 사슴뿔도 사르륵 재가 되어 사라진다"
            ],
            "visual_inferences": [
              "fixed_element clear_moonlight_environment applied",
              "The black smoke entity is physically connected to the woman's torso, rising upwards to exit the body",
              "Lower and side background establishes the grim aftermath beneath the rising smoke"
            ],
            "creative_decisions": [
              "Placed the kneeling figure in the lower center to emphasize her collapsing weight, allowing the rising black smoke to dominate the upper space.",
              "Used stark moonlight to highlight the crumbling ash at the chest and the edges of the black smoke."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "anchor",
                "source_phrase": "wide bloodstain pooling on the shadowed ground"
              },
              {
                "owned_token": "brazier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "herb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "offering table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "power cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ritual circle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ritual drum",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrine",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smoke",
                "usage_kind": "redraw",
                "source_phrase": "Dense black smoke curls upward from her wounded torso"
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "talisman",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d99c0499976e3a6d",
              "owned_hash": "8dcb673d49d1e90f",
              "camera_direction_hash": "065dec50de97e0a0",
              "owned_usage_hash": "946c4ef6a64a00a4",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "bloodstain",
                  "violating_phrase": "wide bloodstain pooling on the shadowed ground",
                  "reason": "The prompt references the existing background bloodstain as part of the scene's setting, aligning with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "smoke",
                  "violating_phrase": "Dense black smoke curls upward from her wounded torso",
                  "reason": "The prompt describes smoke emerging from the character's body, which is explicitly and structurally required by the shot intent ('몸에서 검은 연기가 빠져나오고').",
                  "verdict": "allowed_visual_state_change"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 78,
        "dependency_reason": "exact_background",
        "_shot_index": 14,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 111,
            "shot_index": 14
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From the established position in front of the kneeling 김지후(강수리영), begin on her wounded torso and tilt upward with the emerging 그분(검은 연기 형체). Keep her folded body in the lower center as the smoke rises through the middle and upper frame, retaining the body as the physical source until the form begins to disperse above her.",
            "lighting_mood": "Clear full-moon light outlines the dense black smoke against the night while preserving the kneeling figure in severe, restrained contrast.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L27B03",
            "reference_usage": "exact_background",
            "owned_objects": [
              "altar",
              "bloodstain",
              "brazier",
              "flag",
              "herb",
              "lantern",
              "offering table",
              "power cable",
              "ritual circle",
              "ritual drum",
              "rope",
              "shrine",
              "smoke",
              "stone wall",
              "talisman"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "clear_moonlight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is bathed in clear, stark light from a full moon in the night sky. This illumination creates strong low-key contrasts with deep shadows across the entire area.",
                "applies_to_shots": [
                  11,
                  14,
                  19
                ],
                "element_scope": "full",
                "source_facts": [
                  "Clear full-moon light after the eclipse renders the impact in stark low-key contrast",
                  "Clear full-moon light outlines the dense black smoke",
                  "Clear full-moon light catches the falling tears"
                ],
                "visual_inferences": [
                  "The light is cold, singular, and highly directional from above, casting harsh shadows."
                ],
                "creative_decisions": [
                  "Using the pristine moonlight to dramatically highlight the gruesome aftermath and emotional peaks."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 78,
                "shot_index": 1,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L27B03",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "92dc95a1252aff16"
      },
      {
        "scene_index": 111,
        "heading": "114. 같은 장소 - 잠시 후",
        "beat_title": "The Aftermath of Tragedy",
        "representative_moment": "A young man cries in sheer shock and sorrow, staring off-screen at the fallen woman amidst a field of corpses.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "close three-quarter profile at seated eye-level, stark moonlight, soft depth of field",
            "t2i_prompt": "Photorealistic cinematic still. A Korean young man in a blood-soaked torn jacket, seated and captured in a close three-quarter right profile at eye level, occupying the left-center of the frame. His tear-streaked face is contorted in profound shock and grief, heavy tears catching the stark light as they fall. His gaze is fixed off-screen toward the right edge. He is slumped among bodies, chest and shoulders visible. The environment is bathed in clear, cold full-moon light from above, creating strong low-key contrasts and deep shadows across his features. [: soft, out-of-focus mounds of scattered dead bodies and dark blood puddles on the devastated ground in the dark background].",
            "outfit_assignments": [],
            "source_facts": [
              "In-woo cries in shock, staring at the fallen Su-ri-young.",
              "Clear full-moon light after the eclipse renders the impact in stark low-key contrast.",
              "The ground is a devastated battlefield covered with scattered dead bodies and dark puddles of blood."
            ],
            "visual_inferences": [
              "Close framing highlights the facial tension and falling tears while rendering the horrific environment as a soft background.",
              "The stark low-key moonlight emphasizes the emotional devastation on his face."
            ],
            "creative_decisions": [
              "Positioning the character in the left-center looking right to emphasize the narrative weight of what he just did off-screen.",
              "Using a shallow depth of field (close framing) to focus entirely on the emotional peak rather than the gory details of the background."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "altar",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "bloodstain",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "brazier",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "flag",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "herb",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "lantern",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "offering table",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "power cable",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ritual circle",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "ritual drum",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "shrine",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "smoke",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "stone wall",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "talisman",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "d176848705a75c74",
              "owned_hash": "8dcb673d49d1e90f",
              "camera_direction_hash": "7091c4989a69ef15",
              "owned_usage_hash": "0cb10e990fd000e6",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 60,
        "dependency_reason": "location atmosphere reference (exact_background/zoom_in_detail handled as a close framing background abstraction)",
        "_shot_index": 19,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 111,
            "shot_index": 19
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "Finish the dolly-in at 정인우's seated eye level from his side, holding a close three-quarter profile rather than a frontal portrait. His tear-streaked face occupies the left-center with his gaze aimed beyond the right edge toward the fallen 김지후(강수리영), while only soft fragments of the corpse-strewn ground remain behind him.",
            "lighting_mood": "Clear full-moon light catches the falling tears and broken facial tension against a subdued, low-key background.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": false,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L27B03",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "clear_moonlight_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The environment is bathed in clear, stark light from a full moon in the night sky. This illumination creates strong low-key contrasts with deep shadows across the entire area.",
                "applies_to_shots": [
                  11,
                  14,
                  19
                ],
                "element_scope": "full",
                "source_facts": [
                  "Clear full-moon light after the eclipse renders the impact in stark low-key contrast",
                  "Clear full-moon light outlines the dense black smoke",
                  "Clear full-moon light catches the falling tears"
                ],
                "visual_inferences": [
                  "The light is cold, singular, and highly directional from above, casting harsh shadows."
                ],
                "creative_decisions": [
                  "Using the pristine moonlight to dramatically highlight the gruesome aftermath and emotional peaks."
                ],
                "confidence": "high"
              },
              {
                "element_id": "corpse_strewn_ground",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The ground is a devastated battlefield covered with scattered dead bodies. Dark puddles of blood are pooled on the uneven surface among the corpses.",
                "applies_to_shots": [
                  11,
                  19
                ],
                "element_scope": "full",
                "source_facts": [
                  "devastated surroundings",
                  "corpse-strewn ground",
                  "죽어 널부러진 육혈귀와 인간의 시체들… 피가 좁은 내를 이뤄 흐르고, 질퍽한 핏빛 웅덩이도 여기저기 패여있다"
                ],
                "visual_inferences": [
                  "The bodies form irregular mounds in the background, making the terrain look chaotic and horrific."
                ],
                "creative_decisions": [
                  "Keeping the gruesome details of the bodies slightly subdued in the background shadows to focus on the main characters' actions and emotions."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 60,
                "shot_index": 9,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "cf0672aacdad5f8b"
      },
      {
        "scene_index": 112,
        "heading": "실외. 금월도 선착장 - 낮",
        "beat_title": "승선을 거부하며 선착장에 남기를 택하는 지후",
        "representative_moment": "어선에 탄 남자가 선착장에 선 여자를 향해 손을 내밀지만, 두 사람의 손은 맞닿지 않는다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Chest-height static slightly wide view, bright high-contrast daylight",
            "t2i_prompt": "Photorealistic cinematic still. The gap between the deck and pier beneath the offered hands lies in the middle-center midground, separating an Asian man in his 30s on the fishing boat deck at frame left from an Asian woman in her 20s standing upright on the pier at frame right. Viewed from chest height beside the gap in a static, slightly wide view, the Asian man stands at three-quarter angle from the right, leaning forward with his arm extended, looking down. The Asian woman stands at three-quarter angle from the left, reaching across the gap, looking down. Their extended arms form a diagonal toward the center without touching, preserving the physical separation between them. The outdoor coastal pier setting is illuminated by bright natural daylight under a clear, bright blue sky. The adjacent ocean water sparkles under the strong natural sunlight, as the visible water surface catches daylight in bright glints between the fishing boat and the pier.",
            "outfit_assignments": [],
            "source_facts": [
              "S115 action: 인우가 낚시 어선에 올라타 지후를 향해 손을 내민다. 지후가 손을 뻗으려다 돌연 손을 내린다.",
              "Shot description: 어선 갑판에 먼저 올라탄 정인우가 선착장에 선 김지후를 향해 손을 뻗어 내민 모습."
            ],
            "visual_inferences": [
              "fixed_element pier_daytime_environment: An outdoor coastal pier setting during the daytime. The sky is a clear, bright blue, and the adjacent ocean water sparkles under the strong natural sunlight.",
              "fixed_element ji_hoo_standing_posture: The woman stands upright on the pier.",
              "The gap between the deck and pier visually emphasizes their diverging choices."
            ],
            "creative_decisions": [
              "Positioned the physical gap between the boat and pier in the middle-center midground to anchor the composition around their unjoined hands.",
              "Maintained the sparkling sea and bright daylight to contrast the melancholic weight of their separation."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [
              "fsc_001"
            ],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "anchor",
                "source_phrase": "fishing boat deck"
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "guardrail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "harbor light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "pier at frame right"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "220e285adb3dfa91",
              "owned_hash": "d8117e91b91102d4",
              "camera_direction_hash": "ffd09d65ec03b19d",
              "owned_usage_hash": "b81b09537de128e2",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "fishing boat",
                  "violating_phrase": "on the fishing boat deck",
                  "reason": "The prompt mentions the fishing boat deck purely as a spatial anchor to position the character, matching the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pier",
                  "violating_phrase": "pier at frame right",
                  "reason": "The pier is used solely as a structural and setting anchor for the characters and environment, which aligns with the producer's anchor declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 59,
        "dependency_reason": "previous_shot_refs designates S59_Shot16 as exact_background reference to maintain consistency of the established pier setting.",
        "_shot_index": 6,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 112,
            "shot_index": 6
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From chest height beside the gap, hold a static, slightly wide view with 정인우 on the deck at frame left and 김지후(강수리영) on the pier at frame right. Their extended arms form a diagonal toward the center without touching, while the visible separation beneath their hands preserves the physical choice still between them.",
            "lighting_mood": "Bright natural daylight under the clear blue sky is held in controlled contrast against the sparkling sea.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": {
              "reason": "required_background_position",
              "constraints": [
                {
                  "constraint_id": "fsc_001",
                  "depth_plane": "midground",
                  "gesture_action": "none",
                  "gesture_target_label": "",
                  "label": "gap between the deck and pier beneath the offered hands",
                  "screen_zone": "middle_center",
                  "target_id": "",
                  "target_kind": "background"
                }
              ]
            },
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L25B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "cabin",
              "fender",
              "fish crate",
              "fishing boat",
              "gangway",
              "guardrail",
              "harbor light",
              "life ring",
              "mooring rope",
              "navigation light",
              "pier"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_daytime_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor coastal pier setting during the daytime. The sky is a clear, bright blue, and the adjacent ocean water sparkles under the strong natural sunlight.",
                "applies_to_shots": [
                  6,
                  8,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 선착장 - 낮",
                  "화창하게 푸른 하늘 밑 눈부시게 반짝이는 바다"
                ],
                "visual_inferences": [
                  "The pier is a solid structure capable of serving as a dock for a fishing boat."
                ],
                "creative_decisions": [
                  "Maintaining bright, high-contrast natural daylight to juxtapose the weighty emotional decisions with the beautiful coastal weather."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ji_hoo_standing_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Ji-hoo stands upright on the pier. Although her arm movements and facial expressions change during the scene, her foundational standing posture and location on the pier remain consistent.",
                "applies_to_shots": [
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "선착장에 선 김지후(강수리영)"
                ],
                "visual_inferences": [
                  "She is positioned near the edge of the pier to visually emphasize the physical separation from the boat."
                ],
                "creative_decisions": [],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 59,
                "shot_index": 16,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L25B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "0b72d89c895b5e11"
      },
      {
        "scene_index": 112,
        "heading": "115. 실외. 금월도 선착장 - 낮",
        "beat_title": "지후의 거절과 섬에 남기로 한 결심",
        "representative_moment": "지후가 뻗었던 팔을 내리며 굳은 표정으로 배 타기를 거절하고 시선을 섬 쪽으로 돌린다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "medium composition on the pier, clear natural daytime light with high contrast",
            "t2i_prompt": "Photorealistic cinematic still. An Asian young woman in casual clothes stands upright at three-quarter angle from the right on a solid outdoor coastal pier, occupying the left-center of the frame. Her arm is captured settling beside her hip, her face carrying a firm expression, eyes fixed off-screen toward the open inland space on the left. The pier's length recedes toward the background. Only the side of a fishing boat remains visible near the right edge of the frame. Behind her, a clear bright blue sky arches over the sea, the visible surface of the water reflecting the strong natural daylight as sparkling highlights.",
            "outfit_assignments": [],
            "source_facts": [
              "실외. 금월도 선착장 - 낮",
              "화창하게 푸른 하늘 밑 눈부시게 반짝이는 바다",
              "손을 뻗어 인우 손을 잡으려던 지후. 돌연 손을 내린다.",
              "지후, 선착장 저쪽, 섬 쪽으로 눈짓을 한다."
            ],
            "visual_inferences": [
              "fixed_element character_state: Ji-hoo stands upright on the pier with arm settling beside her hip.",
              "fixed_element environment_state: The pier is a solid structure capable of serving as a dock.",
              "The character is positioned slightly left of center to visually open up the space in the direction of her gaze."
            ],
            "creative_decisions": [
              "Used a tight medium composition focused on the woman's firm expression and settling arm to emphasize her emotional decision.",
              "Maintained bright, high-contrast natural daylight reflecting on the sea to contrast the weighty moment with the beautiful weather."
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "background"
            ],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "anchor",
                "source_phrase": "side of a fishing boat"
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "guardrail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "harbor light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "anchor",
                "source_phrase": "on a solid outdoor coastal pier"
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "8e8c4658bba45a95",
              "owned_hash": "d8117e91b91102d4",
              "camera_direction_hash": "f02ba72d1d6f1d1b",
              "owned_usage_hash": "10082849ea58b2fa",
              "validator": "scene_detail_owned_objects.v1",
              "violations": [
                {
                  "owned_object": "fishing boat",
                  "violating_phrase": "Only the side of a fishing boat remains visible near the right edge of the frame",
                  "reason": "The prompt mentions the fishing boat only to define framing and composition near the edge, which represents an anchor reference and matches the producer's declaration.",
                  "verdict": "anchor_reference"
                },
                {
                  "owned_object": "pier",
                  "violating_phrase": "on a solid outdoor coastal pier",
                  "reason": "The prompt uses the pier as a spatial grounding and background element for character placement and perspective, which acts as an anchor reference, matching the producer's declaration.",
                  "verdict": "anchor_reference"
                }
              ]
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 59,
        "dependency_reason": "Shares the same daytime pier environment and character's foundational standing posture established in Scene 59.",
        "_shot_index": 8,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 112,
            "shot_index": 8
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "medium",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "At 김지후(강수리영)'s eye level on the pier, dolly from a medium view into a tight medium composition as her extended arm drops and settles beside her. Hold her slightly left of center with open space toward the inland side; after the move stops, her eyes begin to redirect into that space for the following pan.",
            "lighting_mood": "Clear daytime light remains bright and natural, with controlled contrast holding 김지후(강수리영)'s firm expression against the sparkling water.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "background_ref_attached",
            "bg_id": "L25B02",
            "reference_usage": "exact_background",
            "owned_objects": [
              "bollard",
              "cabin",
              "fender",
              "fish crate",
              "fishing boat",
              "gangway",
              "guardrail",
              "harbor light",
              "life ring",
              "mooring rope",
              "navigation light",
              "pier"
            ],
            "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",
              "if focusing on an owned object, declare its reference-kind via the reference_phrase_kinds sidecar (producer contract)"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_daytime_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor coastal pier setting during the daytime. The sky is a clear, bright blue, and the adjacent ocean water sparkles under the strong natural sunlight.",
                "applies_to_shots": [
                  6,
                  8,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 선착장 - 낮",
                  "화창하게 푸른 하늘 밑 눈부시게 반짝이는 바다"
                ],
                "visual_inferences": [
                  "The pier is a solid structure capable of serving as a dock for a fishing boat."
                ],
                "creative_decisions": [
                  "Maintaining bright, high-contrast natural daylight to juxtapose the weighty emotional decisions with the beautiful coastal weather."
                ],
                "confidence": "high"
              },
              {
                "element_id": "ji_hoo_standing_posture",
                "element_type": "character_state",
                "character_name": "김지후(강수리영)",
                "description": "Ji-hoo stands upright on the pier. Although her arm movements and facial expressions change during the scene, her foundational standing posture and location on the pier remain consistent.",
                "applies_to_shots": [
                  6,
                  8
                ],
                "element_scope": "full",
                "source_facts": [
                  "선착장에 선 김지후(강수리영)"
                ],
                "visual_inferences": [
                  "She is positioned near the edge of the pier to visually emphasize the physical separation from the boat."
                ],
                "creative_decisions": [],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 59,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "background",
                "id": "L25B02",
                "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"
            ]
          },
          "render_contracts": [],
          "_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": "17e5e0313f8d0650"
      },
      {
        "scene_index": 112,
        "heading": "실외. 금월도 선착장 - 낮",
        "beat_title": "지후의 따뜻한 배웅과 이별",
        "representative_moment": "A tight facial close-up of Jihoo smiling warmly at the camera, with a narrow trace of the sparkling waterfront at the edge.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "subjective POV tight facial close-up, center-left composition, bright high-contrast daylight",
            "t2i_prompt": "Photorealistic cinematic still. Subjective POV tight facial close-up. An Asian woman in her 20s in a casual jacket, facing the camera, her chin lifting into a warm answering smile. Her eyes are fixed directly on the camera, her face occupying most of the center-left frame. At the right frame edge, a narrow trace of the background is visible, [L25B02: an out-of-focus waterfront surface catching bright natural daylight, the ocean water sparkling under the strong sun]. The bright natural daylight is shaped into gentle facial contrast, highlighting the warmth of her expression against the cool blue coastal context.",
            "outfit_assignments": [],
            "source_facts": [
              "S112 action: Jihoo smiles warmly at Inwoo in response",
              "Shot description: subjective POV tight facial close-up of Jihoo",
              "fixed_element: bright blue sky and sparkling ocean water"
            ],
            "visual_inferences": [
              "The tight framing creates an out-of-focus background where only the sparkling sea is identifiable",
              "The daylight casts gentle facial contrast suitable for the intimate emotional beat"
            ],
            "creative_decisions": [
              "Center-left framing emphasizes her face while keeping a narrow trace of the waterfront to anchor the spatial context",
              "Subjective camera angle places the viewer in Inwoo's position to capture her direct gaze"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [],
            "owned_object_usage": [
              {
                "owned_token": "bollard",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "cabin",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fender",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fish crate",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "fishing boat",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "gangway",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "guardrail",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "harbor light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "life ring",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "mooring rope",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "navigation light",
                "usage_kind": "absent",
                "source_phrase": ""
              },
              {
                "owned_token": "pier",
                "usage_kind": "absent",
                "source_phrase": ""
              }
            ],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "f1fc1b61ed7cba37",
              "owned_hash": "d8117e91b91102d4",
              "camera_direction_hash": "273f8005b6126051",
              "owned_usage_hash": "5ce4a4a9436bcfb3",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 112,
        "dependency_reason": "Same location (Geumwoldo pier) and time of day, preserving the bright daylight and sparkling sea established in prior shots.",
        "_shot_index": 16,
        "visible_entities": [],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 112,
            "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 정인우's side of the exchange at 김지후(강수리영)'s eye level, treat the move as his subjective gaze and dolly into a tight facial close-up. Her face occupies most of the center-left frame while a narrow trace of the waterfront remains at the edge; the inward move ends precisely as her bittersweet expression warms into an answering smile.",
            "lighting_mood": "Bright natural daylight is shaped into gentle facial contrast, preserving the scene's blue coastal context without weakening the warmth of her gaze.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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": [],
            "allowed_outlook_pairs": [],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "background_binding": {
            "mode": "skipped_close_framing",
            "bg_id": "L25B02",
            "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "pier_daytime_environment",
                "element_type": "environment_state",
                "character_name": "",
                "description": "An outdoor coastal pier setting during the daytime. The sky is a clear, bright blue, and the adjacent ocean water sparkles under the strong natural sunlight.",
                "applies_to_shots": [
                  6,
                  8,
                  16
                ],
                "element_scope": "full",
                "source_facts": [
                  "실외. 금월도 선착장 - 낮",
                  "화창하게 푸른 하늘 밑 눈부시게 반짝이는 바다"
                ],
                "visual_inferences": [
                  "The pier is a solid structure capable of serving as a dock for a fishing boat."
                ],
                "creative_decisions": [
                  "Maintaining bright, high-contrast natural daylight to juxtapose the weighty emotional decisions with the beautiful coastal weather."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 112,
                "shot_index": 6,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "ece632de8c3e7855"
      },
      {
        "scene_index": 113,
        "heading": "116. 실외. 낚시 어선 - 낮",
        "beat_title": "멀어지는 배와 애써 짓는 미소",
        "representative_moment": "어선 위에서 바라본 시점, 멀어지는 선착장에 홀로 남아 카메라를 향해 미소 짓는 C01의 모습.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "Subjective POV from the rear of the departing boat, wide framing, bright natural daylight with sparkling water highlights.",
            "t2i_prompt": "Photorealistic cinematic still. From an eye-level position on the departing boat, looking backward across the expanding sea. The wooden aft edge of the fishing boat occupies the lower foreground, confirming the viewpoint. In the distant center of the wide frame, C01O01 in casual clothes, a young Korean woman in her early 20s, stands as a small, solitary full figure. She is facing the camera, her feet planted firmly on the edge of the receding stone pier, looking at the camera with a faint smile. Her pretty oval face, young and pale impression, and long black straight hair are visible, her hair visibly tossed by the continuous sea breeze. The end of the pier faces toward the departing boat. The expanse of water between the camera and the pier catches the bright natural daytime daylight in sparkling highlights, widening to emphasize the physical distance.",
            "outfit_assignments": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "source_facts": [
              "지후는 여전히 선착장에 서서 멀어지는 인우를 바라본다",
              "빙그레 애써 웃는 얼굴이다",
              "금월도가 멀어진다",
              "반짝이는 물결"
            ],
            "visual_inferences": [
              "The camera acts as In-woo's eyes (subjective POV from the boat)",
              "The aft edge of the boat is visible in the foreground to anchor the viewpoint",
              "fixed_element: bright natural daytime daylight and continuous sea breeze tossing hair"
            ],
            "creative_decisions": [
              "Wide framing to emphasize the expanding distance between the boat and the solitary figure on the pier",
              "Sparkling water highlights contrast beautifully with the melancholy of the farewell"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "14702f7283878a61",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "a6673c6d9fb76a9f",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 74,
        "dependency_reason": "Atmosphere and location reference for the Geumwoldo pier and surrounding sea from S74.",
        "_shot_index": 3,
        "visible_entities": [
          "C01"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 113,
            "shot_index": 3
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "wide",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "From eye level at the rear of the moving boat, look backward as 정인우 would, holding the camera static relative to the vessel while the dock recedes. 김지후(강수리영) remains a small, solitary full figure near the center of the wide frame, her planted posture and faint smile readable against the growing expanse of water.",
            "lighting_mood": "Natural daytime light and sparkling water highlights keep the farewell outwardly beautiful while the widening distance carries the melancholy.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C01",
                "outlook_id": "O01"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_maritime_weather",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene takes place under bright, natural daytime daylight typical of a sunny maritime setting. A continuous sea breeze affects the environment, visibly tossing hair and exposing the surrounding elements to the wind. The atmosphere remains clear with sunlight softly illuminating the subjects and reflecting off the surrounding water.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime light and sparkling water highlights",
                  "Natural daylight catches the clear tears and wind-tossed hair"
                ],
                "visual_inferences": [
                  "The weather is clear and breezy, maintaining consistent outdoor sunlight and wind across both the dock and the moving boat."
                ],
                "creative_decisions": [
                  "Using a consistently bright and beautiful daylight setting to create an emotional contrast with the melancholy of the characters' farewell."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 74,
                "shot_index": 8,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "props held by characters face one direction only — toward camera OR toward character, never both"
            ]
          },
          "asset_requirements": {
            "required_refs": [
              {
                "kind": "character_outlook",
                "id": "C01O01",
                "policy": "required"
              }
            ],
            "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"
            ]
          },
          "render_contracts": [],
          "_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": "d0f41e9ca0db9f1b"
      },
      {
        "scene_index": 113,
        "heading": "실외. 낚시 어선 - 낮",
        "beat_title": "슬픔의 눈물과 완전한 이별",
        "representative_moment": "육지를 향해 고개를 돌린 C03O04의 흩날리는 머리카락과 맺힌 눈물이 클로즈업된다.",
        "t2i_variations": [
          {
            "variant_label": "var_1",
            "camera_effect": "eye-level intimate facial close-up, natural daylight with restrained contrast",
            "t2i_prompt": "Photorealistic cinematic still. C03O04 in a fishing suit, a Korean man in his mid-20s, occupies the central two-thirds of the frame in an eye-level facial close-up, captured at a three-quarter left angle. His head turns toward the land, gazing into the distance beyond the frame. Clear tears in his eyes catch the bright, natural daytime sunlight. A continuous sea breeze tosses his short black hair, strands crossing his clean facial outline. Behind his profile, the defocused sparkling sea surface reflects the daylight, with a minimal slice of the boat deck visible at the lower frame edge.",
            "outfit_assignments": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "source_facts": [
              "shot description: 바닷바람에 머리카락이 흩날리는 가운데 육지 쪽을 향해 시선을 고정하고 눈가에 맑은 눈물이 맺혀 있는 정인우의 얼굴 클로즈업",
              "scene text: 고개를 돌려 육지를 보는 인우의 눈가에는 울컥 눈물이 맺힌다",
              "shot angles: three_quarter_left, head turning toward land, gaze=distant"
            ],
            "visual_inferences": [
              "fixed_element daytime_maritime_weather: bright natural daytime sunlight, continuous sea breeze tossing his hair",
              "defocused background of sparkling sea to isolate the subject in a close framing"
            ],
            "creative_decisions": [
              "eye-level dolly in to an intimate facial close-up occupying the central two-thirds of the frame to capture his restrained sorrow",
              "placing the boat deck at the minimal lower edge to physically anchor the close-up aboard the vessel without overwhelming the frame"
            ],
            "confidence": "high",
            "applied_frame_spatial_constraint_ids": [],
            "reference_phrase_kinds": [
              "character"
            ],
            "owned_object_usage": [],
            "owned_validation": {
              "schema_version": 2,
              "t2i_prompt_hash": "a14be4ca406a8ad4",
              "owned_hash": "e3b0c44298fc1c14",
              "camera_direction_hash": "158c63e765be3f1e",
              "owned_usage_hash": "4f53cda18c2baa0c",
              "validator": "scene_detail_owned_objects.v1.close_skip",
              "violations": []
            }
          }
        ],
        "scene_type": "normal",
        "dependent_scene_index": 69,
        "dependency_reason": "연속성 유지를 위한 장소 참조가 존재하나, 클로즈업 프레이밍(skipped_close_framing)으로 인해 배경 참조는 합성에서 제외됨",
        "_shot_index": 4,
        "visible_entities": [
          "C03"
        ],
        "render_prompt_card": {
          "schema_version": 1,
          "shot_key": {
            "scene_index": 113,
            "shot_index": 4
          },
          "render_strategy": {
            "mode": "direct",
            "primary_subject": "",
            "framing_scale": "close",
            "moment_lock": "single still moment from the selected shot only",
            "camera_direction": "On 정인우's landward side at eye level, dolly from close distance into an intimate facial close-up, ending with his face occupying roughly the central two-thirds of the frame. Keep him in a three-quarter turn rather than frontal portraiture, with his tear-bright eyes fixed beyond the frame and his wind-moved hair crossing the clean outline of his face.",
            "lighting_mood": "Natural daylight catches the clear tears and wind-tossed hair while restrained contrast keeps the emotion intimate rather than sentimental.",
            "perception_mode": "direct",
            "spatial_consistency": {
              "camera_frame_rule": {
                "applies_when": "camera_direction expresses a vertical camera height or viewpoint position 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, wide, insert} from `shot_staging.framing_scale` enum (render_strategy.framing_scale, production SOT). LLM consumes the enum only; keyword classification is forbidden.",
                "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"
                  ],
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "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",
                  "subject_reference_policy_cross_ref": "see id_policy.subject_reference_policy (subject_reference_policy SOT — policy enum 에 따라 ID/outlook 사용)"
                },
                "self_check_steps": [
                  "read framing_scale enum from render_strategy.framing_scale (do NOT infer 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 측면."
            },
            "frame_spatial_contract": null,
            "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"
            ],
            "allowed_outlook_pairs": [
              {
                "character_id": "C03",
                "outlook_id": "O04"
              }
            ],
            "must_use_composite_character_ids": true,
            "common_noun_required_when": [
              "a reproduced face inside any declared reproduction surface",
              "unregistered extra"
            ],
            "id_use_required_when": [
              "a physical photo/poster/document/picture-frame/map/key prop appearing in the scene — use its P## ID and preserve canonical content from entity_canon"
            ],
            "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 와 본문 묘사가 충돌"
            },
            "reproduction_surface_rule": {
              "applies": true,
              "id_use": "forbidden — generic descriptor with demographic only",
              "rationale_summary": "C##O## 은 얼굴 reference 이미지를 원본 해상도로 inject 하므로 사진/화면/반사 표면 안 얼굴이 표면 밖 실물 크기로 합성됨. 이 rule 은 표면 안 얼굴 (face) 에만 적용 — 물리적 사진/액자/문서 prop 자체는 P## ID 보존 (Patch A)."
            },
            "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) 를 작품 단위 고정"
            },
            "subject_reference_policy": [],
            "constraints": [
              "ID format for visible subjects (C## bare, C##O## composite IDs, or common-noun descriptor) is determined per-subject by the id_policy per-subject policy array — see constraints[2] below",
              "do not use C##O## for a reproduced face inside any element flagged by id_policy.reproduction_surface_rule.applies (declared reproduction surface) — use a generic descriptor with demographic instead. NOTE: the physical photo/poster/document/picture-frame/map/key prop itself MUST use its P## ID — the generic-descriptor rule applies only to a face reproduction, not to the prop entity.",
              "per-subject identity reference policy is provided in id_policy.subject_reference_policy[] — apply each subject's policy when emitting references: (a) id_and_outlook_required ⇒ subject must use C##O## composite ID; (b) base_id_required ⇒ subject must use bare C## only (no outlook); (c) generic_descriptor_allowed ⇒ subject must NOT use C## or C##O##, render with a common/demographic descriptor only. omitted subjects default to id_and_outlook_required",
              "when an ID is required for a subject (policy = id_and_outlook_required or base_id_required) and a C##O## (or C##) is introduced 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. does not apply to generic_descriptor_allowed subjects (no ID emitted)",
              "when an ID is required (policy = id_and_outlook_required or base_id_required), 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). does not apply to generic_descriptor_allowed subjects — those use a common/demographic descriptor with no C##/C##O##"
            ]
          },
          "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",
              "describe the close subject and its immediate surroundings without relying on the absent background reference",
              "use [L##: ...] block for frame-edge surface description"
            ]
          },
          "continuity_elements_used": {
            "fixed_elements": [
              {
                "element_id": "daytime_maritime_weather",
                "element_type": "environment_state",
                "character_name": "",
                "description": "The scene takes place under bright, natural daytime daylight typical of a sunny maritime setting. A continuous sea breeze affects the environment, visibly tossing hair and exposing the surrounding elements to the wind. The atmosphere remains clear with sunlight softly illuminating the subjects and reflecting off the surrounding water.",
                "applies_to_shots": [
                  3,
                  4
                ],
                "element_scope": "full",
                "source_facts": [
                  "Natural daytime light and sparkling water highlights",
                  "Natural daylight catches the clear tears and wind-tossed hair"
                ],
                "visual_inferences": [
                  "The weather is clear and breezy, maintaining consistent outdoor sunlight and wind across both the dock and the moving boat."
                ],
                "creative_decisions": [
                  "Using a consistently bright and beautiful daylight setting to create an emotional contrast with the melancholy of the characters' farewell."
                ],
                "confidence": "high"
              }
            ],
            "previous_shot_refs": [
              {
                "scene_index": 69,
                "shot_index": 4,
                "ref_usage": "",
                "kind": "location"
              }
            ],
            "forward_zoom_targets": [],
            "cross_shot_id_substitution_rule": {
              "applies_when": "fixed_elements[i].character_name maps to a C## allowed in id_policy.allowed_base_entity_ids OR a C##O## in id_policy.allowed_outlook_pairs",
              "substitution": "replace the common-noun person reference inside fixed_elements[i].description (e.g. 'An Asian man' / 'a woman' / 'a figure') with the matched C## or C##O##",
              "double_description_forbidden": "do not describe the same character with both a C##/C##O## and a separate common-noun person reference in the same t2i_prompt — produces phantom extra figures",
              "preserve_pose_unchanged": "fixed_elements[i].description 의 자세/위치/상태 keyword 는 그대로 유지 — 인물 참조 토큰만 교체",
              "no_repeat_after_pose": "이미 t2i_prompt 안에서 같은 인물의 자세를 묘사했다면, 같은 fixed_element description 을 별도 문장으로 반복하지 마라",
              "rationale_summary": "fixed_element description 이 보통명사로 작성되었고 같은 인물의 C## 묘사가 t2i_prompt 에 따로 있으면 모델이 두 인물로 인식해 인원 수가 부풀려진다"
            },
            "ref_usage_constraints": {
              "zoom_in_detail": {
                "scope_summary": "same moment, same space, same primary subject; camera moved/zoomed onto a sub-region only",
                "forbidden_additions": [
                  "new persons not in the prior shot",
                  "new props not in the prior shot",
                  "new background elements not in the prior shot",
                  "new poses, gestures, or expressions not in the prior shot",
                  "different moments of action"
                ],
                "required_phrasings": [
                  "describe only the focused sub-region in concrete terms",
                  "explicitly state the same environment (lighting, background) is preserved",
                  "use continuity tokens such as 'the same figure', 'the same room', 'the same surface'"
                ],
                "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy applies per-subject; policy enum (id_and_outlook_required / base_id_required / generic_descriptor_allowed) determines C##/C##O## use",
                "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. third-person full body and close-up of the same character must not be combined in a single prompt.",
              "third_person_handling": "describe persons with full or partial body in frame; single-camera consistency forbids combining a partial close-up and the same character's full body in one prompt",
              "close_up_handling": "an isolated framed area of a single subject must not coexist with that subject's full-body description in the same prompt",
              "focus_on_is_focus_area_not_view_switch": "any framing-intent wording designates the area shown by the single camera position; it does not switch the view",
              "subject_reference_policy_cross_ref": "id_policy.subject_reference_policy — subjects with policy = 'base_id_required' or 'generic_descriptor_allowed' must not use outlook reference (C##O## form); additionally, subjects with policy = 'generic_descriptor_allowed' must not use bare C## either — render with a common/demographic descriptor only",
              "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 — third-person full body and close-up of the same character must not be combined in a single shot. any framing-intent wording designates the area shown by the single camera position, not a view switch (id_policy.subject_reference_policy applies per-subject)",
              "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"
            ]
          },
          "render_contracts": [],
          "_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": "000a8c2891abd938"
      }
    ],
    "consumed_bg_catalog_hash": "dd66d818efd3bd53",
    "consumed_shot_binding_hash": "6052358450b52e88"
  },
  "step_id": "scene_detail",
  "run_id": "817cd78d-6d08-4b7e-8c83-684071107f8d",
  "resolved_model": "gemini-pro",
  "updated_at": "2026-08-04T09:39:18.777726+00:00",
  "project_config_snapshot": {}
}